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

时间:2011-11-27 19:12:42

标签: c linux freebsd mac-address sysctl

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

2 个答案:

答案 0 :(得分:6)

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

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

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

1http://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手册页相当差。

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

希望这有帮助。

答案 1 :(得分:2)

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