在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。)
答案 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/route
。 proc_gen_fmt
中定义的lib/proc.c
用于简化输出分析。
所以你的答案,至少在我的GNU / Linux盒子上,是阅读/proc/net/route
。