目前我们正在从命令行解析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。
答案 0 :(得分:2)
通常,这取决于您的操作系统。这没有真正的标准API。
假设您使用的是linux,请打开并解析/ proc / net / arp。格式类似于arp命令的输出格式。请注意,您必须至少一次将数据包发送到相关IP,以便将其放入ARP表中,当然,您不会获得本地段以外的任何内容。
将IP加入此缓存非常容易 - 例如,只需在某个未使用的端口上向其发送UDP数据包 - 然后轮询直到它出现。
另一种选择是使用原始套接字来制作和发送你自己的arp数据包,但这要复杂得多:)如果你想沿着这条路走下去,请研究arping的源代码(页面今天已经关闭,但是git repo在线),通过使用像libpcap这样的平台无关库(但需要root),这也可以为你提供更多的可移植性
答案 1 :(得分:2)
我有点担心
检索外国主机的MAC地址
你问题的一部分。
我希望你知道你只能在同一网络上的机器的ARP表中获得条目。如果通过路由器连接到计算机,则只能在ARP表中看到路由器MAC地址。因此,除非它是同一网络上的主机(不涉及路由器),否则无法知道外部主机的MAC地址。
所以答案是,通过路由器访问的主机是不可能的,如果主机在本地网络上可以访问,则只能使用特定于平台的访问方法,因为即使arp命令的输出也可能不同平台。