目前我们正在解析命令行的 arp 请求输出。
string cmd = "arp -n ";
cmd.append(ipaddress);
cmd.append(" | grep ");
cmd.append(ipaddress);
fgets( line, 130, fp);
fgets( line, 130, fp);
ret.append(line);
...
它可以工作,但是有没有办法使用一个不太依赖本机命令行界面的库函数来做到这一点?该项目目前正在使用 libpcap。
目前我们正在解析命令行的 arp 请求输出。
string cmd = "arp -n ";
cmd.append(ipaddress);
cmd.append(" | grep ");
cmd.append(ipaddress);
fgets( line, 130, fp);
fgets( line, 130, fp);
ret.append(line);
...
它可以工作,但是有没有办法使用一个不太依赖本机命令行界面的库函数来做到这一点?该项目目前正在使用 libpcap。
通常,这取决于您的操作系统。对此没有真正的标准 API。
假设你在 linux 上,打开并解析 /proc/net/arp. 格式类似于 arp 命令的输出。请注意,您必须最近至少向相关 IP 发送一次数据包才能将其放入 ARP 表中,当然您不会在本地网段之外获得任何信息。
将一个 IP 放入这个缓存很容易——例如,只需在某个未使用的端口上向它发送一个 UDP 数据包——然后轮询直到它出现。
另一种选择是使用原始套接字来制作和发送您自己的 arp 数据包,但这要复杂得多:) 如果您确实想走这条路,请研究arping的源代码(今天页面已关闭,但git repo在线),这也可能通过使用 libpcap 等平台无关的库(但需要 root)为您提供更多的可移植性
我有点担心
检索外部主机的 MAC 地址
你问题的一部分。
我希望您知道您只能在同一网络上的机器的 ARP 表中获得条目。如果您通过路由器连接到机器,那么您将只能在 ARP 表中看到路由器的 MAC 地址。因此,除非它是同一网络上的主机(不涉及路由器),否则无法知道外部主机的 MAC 地址。
所以答案是通过路由器访问的主机是不可能的,如果主机可以在本地网络上访问,您只能使用特定于平台的访问方法,因为即使是 arp 命令的输出也可能因平台而异。