我问一下,对我们这样刚开始接触Linux编程的人来说,没有 文档又如何知道要使用 SIOCGIFHWADDR 和 struct ifreq ??? 以后要碰到这种问题的话,有没有什么线索可以帮我们找到需 要的答案?可别说搜索 google/baidu/julwiki 之类的。
是有方法可以去找线索的,你不是说可以用 ifconfig 来查找 ip和mac么?那我们就可以从这里去找线索。 最最直接的方式,就是去看 ifconfig 的源代码,但是也许我 们没有这么多时间去看这些代码。我们可以使用 strace 程序, 来跟踪一下 ifconfig 会用到什么哪些系统调用。比方像我这 样: [yihect@panda ~]$ strace /sbin/ifconfig eth0 这个命令输出了很多系统调用的执行。一般情况下面,像取得 ip/mac 之类的事情,不会由 read/read/write/mmap2/close 等系统调用来完成,而是要通过 ioctl 的系统调用来完成。 那我们就关注这个命令的输出中,那些 ioctl 的对应行。在 其中,你可以找到像下面这样的内容: ... ioctl(5, SIOCGIFHWADDR, {ifr_name="eth0", ifr_hwaddr=00:0c:29:f5:6a:8a}) = 0 ...ioctl(4, SIOCGIFADDR, {ifr_name="eth0", ifr_addr={AF_INET, inet_addr("192.168.220.3")}}) = 0
... 看到了吧,这就是我们要的东西了。接下来,很自然的, 我们就需要用到这里出现的东西作为关键字来查找 /usr/include 目录,看其中的哪些头文件定义了这些东西: SIOCGIFHWADDR, SIOCGIFADDR, ifr_name, ifr_hwaddr, ifr_addr 以 ifr_hwaddr 为例,我使用的命令是: find /usr/include -type f -name "*.h" -exec grep -l ifr_hwaddr '{}' \; 它告诉我们有两个文件中出现了 ifr_hwaddr 这个关键字: /usr/include/linux/if.h /usr/include/net/if.h 下面那个更加详细,从内容上面可知道,它是属于 c 库 的头文件。我们可以使用里面所定义的这些结构体来取 得网络接口卡(IF)的相关信息。 用同样的方式,我们也可以找到定义有 SIOCGIFHWADDR 的头文件。经过如此的一番 hacking 之后,我们便可以写出前面那样的代码了,对吧?