我试图找出MAC地址,我设法在Linux中使用sysctl创建工作解决方案,问题是,这个解决方案不适用于我正在开发的FreeBSD版本.除了使用sysctl之外,有什么办法可以在C中找到mac地址吗?
解决方法:
使用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的手册:
Not in POSIX.1-2001. This function first appeared in BSDi and is
present on
the BSD systems, but with slightly different semantics documented–returning
one entry per interface, not per address. This means ifa_addr and other
fields can actually be NULL if the interface has no address, and no link-level
address is returned if the interface has an IP address assigned. Also, the
way of choosing either ifa_broadaddr or ifa_dstaddr differs on various
systems.
和
The addresses returned on Linux will usually be the IPv4 and IPv6
addresses
assigned to the interface, but also one AF_PACKET address per interface
containing lower-level details about the interface and its physical layer. In
this case, the ifa_data field may contain a pointer to a struct
net_device_stats, defined in , which contains various
interface attributes and statistics.
所以它的行为可能会有所不同,你可能还需要#ifndef编译.
kernel.org手册页在http://www.kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html确实提供了示例代码,这可能会有所帮助.与上面链接的相比,我的本地linux手册页相当差.
我仍然认为libpcap更便携,只是因为其他人已经完成了所有可移植性工作以及使用它获得的所有额外功能.
希望这可以帮助.