問題は、MACOSX でルーティング テーブルを取得する方法です。netstat -nrという意味ではありません。Cを使用してプログラムで行う方法を意味します。まず、opensource.apple.com から netstat のソース コードをダウンロードしました。mroute.c に void mroutepr (void)関数が見つかりまし た。
この関数は、ルーティング テーブルを取得する関数のように見えますが、よくわかりません。
配列宣言があります: struct vif viftable[CONFIG_MAXVIFS];
しかし、mroutepr をコンパイルしようとしたときに、struct vif が/usr/include/netinet/ip_mroute.h で宣言されていないことがわかりました。必要なすべてのインクルードを追加しました。私はそれを7回チェックしました:))
次に、xnu カーネルのソース コードを確認します。この構造体は、xnu カーネルの次のファイルで見つかりました: xnu/bsd/netinet/ip_mroute.h。 struct vif の完全な定義がありました。
この構造はカーネル モードでのみ使用できるようです。
私は困惑しています。
カーネルコードに対してのみstruct vifを宣言するにはどうすればよいですか? netstatユーティリティは どのように機能しますか?
上記のすべてが正しくありません:)))解決策はroute.cファイルにあります。
ntreestuff(void) 関数は、ルーティング テーブルを取得するためのエントリ ポイントです。次に、np_rtentry(rtm)関数でテーブルをコンソールに出力します。
static void ntreestuff(void)
{
size_t needed;
int mib[6];
char *buf, *next, *lim;
struct rt_msghdr2 *rtm;
mib[0] = CTL_NET;
mib[1] = PF_ROUTE;
mib[2] = 0;
mib[3] = 0;
mib[4] = NET_RT_DUMP2;
mib[5] = 0;
if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
{
err(1, "sysctl: net.route.0.0.dump estimate");
}
if ((buf = malloc(needed)) == 0)
{
err(2, "malloc(%lu)", (unsigned long)needed);
}
if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
{
err(1, "sysctl: net.route.0.0.dump");
}
lim = buf + needed;
for (next = buf; next < lim; next += rtm->rtm_msglen)
{
rtm = (struct rt_msghdr2 *)next;
np_rtentry(rtm);
}
}