Linux C++ 如何以编程方式获取 LAN 上所有适配器的 MAC 地址

Posted

技术标签:

【中文标题】Linux C++ 如何以编程方式获取 LAN 上所有适配器的 MAC 地址【英文标题】:Linux C++ How to Programatically Get MAC address for all adapters on a LAN 【发布时间】:2014-01-28 16:25:58 【问题描述】:

我如何使用 C 或 C++ PROGRAM(无命令行)在我的(小)本地获取 MAC 地址(如果 IP 地址是“免费的”,我也会使用它们)网络。这是一个嵌入式 Busybox Linux,所以我需要一个极简主义的答案,希望不需要移植一些库。我没有 libnet 或 libpcap。如果 DHCP 主机,arp 缓存似乎只包含 MAC。

【问题讨论】:

等等...你想要 ARP 缓存吗? 不,除非它获得更多信息。我想知道一个免费的arp可能吗?还是我需要 RARP? 你的意思是要获取LAN接口的MAC地址吗? 我建议你追踪 arp-scan 的源代码,看看它是如何做到的。 说到这里,这里有一些:Ubuntu,一个单独的Github project。 【参考方案1】:

Full source here.

打开/proc/net/arp,然后像这样读取每一行:

char line[500]; // Read with fgets().
char ip_address[500]; // Obviously more space than necessary, just illustrating here.
int hw_type;
int flags;
char mac_address[500];
char mask[500];
char device[500];

FILE *fp = xfopen("/proc/net/arp", "r");
fgets(line, sizeof(line), fp);    // Skip the first line (column headers).
while(fgets(line, sizeof(line), fp))

    // Read the data.
    sscanf(line, "%s 0x%x 0x%x %s %s %s\n",
          ip_address,
          &hw_type,
          &flags,
          mac_address,
          mask,
          device);

    // Do stuff with it.


fclose(fp);

这直接取自 BusyBox 的 arp 实现,位于 BusyBox 1.21.0 tarball 的 busybox-1_21_0/networking/arp.c 目录中。特别看arp_show()函数。

如果你害怕 C:

命令arp -a 应该会给你你想要的,MAC 地址和IP 地址。

要获取一个子网上的所有MAC地址,可以试试

nmap -n -sP <subnet>
arp -a | grep -v incomplete

【讨论】:

在我看来不像 C/C++。我也没有nmap。这是嵌入式Linux。想想小。 在我看来也不像 C/C++。 :p 只是想办法得到你想要的。想你不会有nmap,但你有arp吗?如果是这样,那对你有用吗?如果arpnmap 根本不是选项,您可以随时查看它们的来源。我会继续挖掘,看看我能不能把别的东西打开。 @WesMiller 已编辑。那更好? :) 看看那些漂亮的缓冲区溢出... nop slide here we go! 无意成为安全的典范,只是为了说明如何读取数据。

以上是关于Linux C++ 如何以编程方式获取 LAN 上所有适配器的 MAC 地址的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式获取进程使用的内存量? [复制]

如何以编程方式获取 linux 内核页面大小

如何以编程方式获取 Linux 上的堆地址

c++:以编程方式将符号转换为代码行号

如何以编程方式获取 gRPC / protobuf 版本?

使用 GetFileVersionInfo API (C++) 以编程方式获取 .exe 的 ProductVersion