【发布时间】:2011-03-22 11:03:25
【问题描述】:
问题是如何在 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 中声明 我已经添加了所有必要的包含。我已经检查了七次:))
然后我检查 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);
}
}
【问题讨论】: