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
吗?如果是这样,那对你有用吗?如果arp
和nmap
根本不是选项,您可以随时查看它们的来源。我会继续挖掘,看看我能不能把别的东西打开。
@WesMiller 已编辑。那更好? :)
看看那些漂亮的缓冲区溢出... nop slide here we go!
无意成为安全的典范,只是为了说明如何读取数据。以上是关于Linux C++ 如何以编程方式获取 LAN 上所有适配器的 MAC 地址的主要内容,如果未能解决你的问题,请参考以下文章
使用 GetFileVersionInfo API (C++) 以编程方式获取 .exe 的 ProductVersion