在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地址;