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

Posted

技术标签:

【中文标题】在 C 中找出 Linux 和 FreeBSD 上的 MAC 地址【英文标题】:Find out MAC address on Linux&FreeBSD in C 【发布时间】:2012-01-07 11:07:22 【问题描述】:

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

【问题讨论】:

【参考方案1】:

使用 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 手册页相当差。

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

希望这会有所帮助。

【讨论】:

我不知道您可以使用 libpcap 找到您自己的 mac 地址。你能指出一些可以帮助我获得我的 mac 的功能吗? @Blackie123:更新了答案。举个例子。 看起来对我来说太麻烦了。为什么不只是 getifaddrs(3)?【参考方案2】:

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

【讨论】:

以上是关于在 C 中找出 Linux 和 FreeBSD 上的 MAC 地址的主要内容,如果未能解决你的问题,请参考以下文章

如何在 FreeBSD 9.1 系统中使用 libdb-4.2?

Linux下mount FreeBSD分区

Vuls:GO语言编写的Linux/FreeBSD上无agent的漏洞扫描器

编写一个处理任意中断和输出到设备的 FreeBSD 内核模块

如何找出 C/C++ 代码中每一行花费了多少时间?

FreeBSD 作为一个开发平台有多好?