[juliantec_list] Re: [juliantec_list] Re:Re: Linux下面怎么样写C代码得到当前我系统里网卡的IP地址和MAC地址?

  • From: "Webm Ju" <web_maint@xxxxxxxxxxxxxx>
  • To: <juliantec_list@xxxxxxxxxxxxx>, "Yihe Chen" <yihect@xxxxxxxxxxxxxx>
  • Date: Mon, 25 Apr 2011 16:35:28 +0800


我问一下,对我们这样刚开始接触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
之后,我们便可以写出前面那样的代码了,对吧?





Other related posts:

  • » [juliantec_list] Re: [juliantec_list] Re:Re: Linux下面怎么样写C代码得到当前我系统里网卡的IP地址和MAC地址? - Webm Ju