从proc文件系统中获取gateway的IP地址
在linux的命令行下获取当前网络环境的gateway的IP并不是一件难事,常用的命令有
ip route
或者route -n
,其实route -n
也是通过读取proc文件系统下的文件来从内核获取路由表的,但ip route
是通过netlink来获取的路由表;本文将讨论如何编写程序从proc文件系统中获取路由表,并从路由表中获取gateway的IP地址,文章最后给出了完整的源程序。
1. 为什么要获取网关的IP地址
以前写过一些与raw socket有关的文章,在使用raw socket发送报文的时候,是需要自己构建以太网报头的,以太网报头中是要填写源地址和目的地址的MAC地址的,源地址的MAC地址就是本机的MAC地址,可以使用ioctl解决,但是目的地址的MAC地址就不好办了,如果是局域网内,我们可以通过arp获取目的地址的MAC地址,因为我们是知道目的地址的IP的,但是如果目的地址在局域网外,我们就要在以太网报头中填写gateway的MAC地址,这时候我们就一定要知道gateway的IP地址,然后通过arp cache获取gateway的MAC地址;
获得了gateway的IP地址以后,可以很容易地从本地arp cache中获得MAC地址的,因为gateway的MAC地址一定会在本地arp cache中,有关如何在操作arp cache,可以参考我的另一篇文章《如何用C语言操作arp c