在Linux和FreeBSD上查找MAC地址

我试图找出MAC地址,我设法在Linux中使用sysctl创build工作解决scheme,问题是,这个解决scheme不适用于我正在开发的FreeBSD版本。 有没有什么办法可以findC以外的地址,而不是使用sysctl?

使用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:大火指出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字段可能包含一个指向结构体net_device_stats的指针,该结构体定义于其中,其中包含各种接口属性和统计信息。

所以它的行为可能会有所不同,无论如何你可能需要#ifndef编译。

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

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

希望这可以帮助。

getifaddrs(3)返回本地接口上的IP地址和MAC地址。 在Linux和FreeBSD之间可移植。