在C中找出Linux和FreeBSD上的MAC地址

Bla*_*123 3 c linux freebsd mac-address sysctl

我试图找出MAC地址,我设法在Linux中使用sysctl创建工作解决方案,问题是,这个解决方案不适用于我正在开发的FreeBSD版本.除了使用sysctl之外,有什么办法可以在C中找到mac地址吗?

Red*_*met 6

使用libpcap库.它是您可以找到的最多平台方式.

该库用于网络嗅探器和入侵检测,以及专门测量其他网络统计信息.用于测量每个进程网络使用情况的nethogs实用程序,用于测量每个机器/端口带宽使用情况的iftop.在许多角色中都非常灵活.

是用C语言编写的,但是有一些其他语言的包装器.

1:http ://en.wikipedia.org/wiki/Pcap
[2]:http ://www.tcpdump.org
[3]:http://sourceforge.net/projects/libpcap/

编辑:这是一个完整,准确和有效的示例,其代码和功能详细说明:http:
//coderrr.wordpress.com/2008/03/07/get-the-mac-address-of-a-local-ip/

有很多教程,源代码是你最好的朋友.

编辑2:blaze指出getifaddrs(3)哪个似乎做了这个工作,只是一些警告,它是一个非posix函数.是一个glibc linux支持但没有文档的bsd函数.几乎是一个没有证件的特色:-)

所有文档都是手册页,并且来自kernel.org的手册:

不在POSIX.1-2001中.该函数首先出现在BSDi中并存在于BSD系统上,但记录的语义略有不同 - 每个接口返回一个条目,而不是每个地址.这意味着如果接口没有地址,ifa_addr和其他字段实际上可以为NULL,如果接口分配了IP地址,则不返回链路级地址.此外,选择ifa_broadaddr或ifa_dstaddr的方式在各种系统上有所不同.

Linux上返回的地址通常是分配给接口的IPv4和IPv6地址,但每个接口还有一个AF_PACKET地址,其中包含有关接口及其物理层的较低级别详细信息.在这种情况下,ifa_data字段可以包含指向struct net_device_stats的指针,该结构包含各种接口属性和统计信息.

所以它的行为可能会有所不同,你可能还是要#ifndef编译.

kernel.org手册页http://www.kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html确实提供了示例代码,这可能会有所帮助.与上面链接的相比,我的本地linux手册页相当差.

我仍然认为libpcap更便携,只是因为其他人已经完成了所有可移植性工作以及使用它获得的所有额外功能.

希望这可以帮助.