如何确定(使用C API)系统的默认NIC?

时间:2010-10-07 20:46:04

标签: networking posix

在Linux中,在建立DHCP租约后,当我运行命令route时,最后一行给出了系统的默认路由和NIC。

如,

Kernel IP routing table
Destination    Gateway         Genmask        Flags Metric Ref   Use IFace
142.157.138.0  *               255.255.254.0  U     2      0       0 wlan0
link-local     *               255.255.0.0    U     1000   0       0 wlan0
default        142.157.138.1   0.0.0.0        UG    0      0       0 wlan0

有没有办法通过C API将NIC标记为“默认”,而不是运行route并解析输出?

感谢。

(感兴趣的是Linux和Darwin,最终是Windows。)

1 个答案:

答案 0 :(得分:4)

我不知道副手,但你可以研究来源。在我的ubuntu框中,route提供了net-tools

~$ which route
/sbin/route
~$ dpkg -S /sbin/route
net-tools: /sbin/route

所以你可以在某处创建一个目录,运行apt-get source net-tools。然后我戳入了源头,route.c看起来像个好地方。如果没有传递给route的参数,则会针对给定的地址系列和选项调用route_info(),因此grep为:

~/z$ grep -r route_info *
lib/net-support.h:extern int route_info(const char *afname, int flags);
lib/getroute.c: *960221 {1.02} Bernd Eckenfels:        renamed from route_info to getroute.c
lib/getroute.c:int route_info(const char *afname, int options)
netstat.c: *960204 {1.10} Bernd Eckenfels:        aftrans, usage, new route_info, 
netstat.c:      i = route_info(afname, options);
route.c: *       {1.79} Bernd Eckenfels:        route_info
route.c:    i = route_info(afname, options);

大。 lib/getroute.c看起来很有希望。它看起来像是根据函数指针表选择调用哪个函数,按地址族排序。让我们找一下IPv4:

inet_aftype.rprint = INET_rprint;

所以我们需要找到INET_rprint的定义。 grep发送:它在lib/inet_gr.c。这里最有趣的是fopen(_PATH_PROCNET_ROUTE, "r"),它在lib/pathnames.h中定义为/proc/net/routeproc_gen_fmt中定义的lib/proc.c用于简化输出分析。

所以你的答案,至少在我的GNU / Linux盒子上,是阅读/proc/net/route