我正在尝试找出 MAC 地址,并设法在 Linux 中使用 sysctl 创建工作解决方案,问题是,该解决方案不适用于我正在开发的 FreeBSD 版本。除了使用 sysctl 之外,还有什么方法可以在 C 中找到 mac 地址?
2 回答
使用 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 字段可能包含指向结构 net_device_stats 的指针,定义在 中,其中包含各种接口属性和统计信息。
所以它的行为可能会有所不同,无论如何你可能都必须#ifndef
编译。
http://www.kernel.org/doc/man-pages/online/pages/man3/getifaddrs.3.html上的 kernel.org 手册页确实提供了示例代码,这可能会有所帮助。与上面的链接相比,我的本地 linux 手册页相当差。
I still think that libpcap is more portable if only because someone else had done all the portability work and all the extra features you gain by using it.
Hope this helps.
getifaddrs(3) returns IP addresses and MAC addresses on local interfaces. Portable between Linux and FreeBSD.