2011-11-27 124 views
2

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

回答

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:大火指出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

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

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

希望这会有所帮助。

+0

我不知道你可以用libpcap找到你自己的mac地址。你能指出我的一些功能,可以帮助我得到我的Mac吗? – Blackie123

+1

@ Blackie123:更新了答案。包括一个例子。 – RedComet

+0

对我来说看起来太麻烦了。为什么不只是getifaddrs(3)? – blaze

1

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