在Linux 2.6.21上执行ARP和逆向ARP(glibc 2.3.5)

我需要在任意IPnetworking上存储对第三方设备的持续引用,其中设备的IP地址可以是静态的或者由DHCP随机分配的。 我不控制networking上的设备,也不能依赖现有的或与设备一起工作的DNS和其他特定networking协议。

所以我被指示调查使用硬件地址和ARP。 这将工作,但我不想重复的代码。 内核必须pipe理一个ARP表。 在Windows上,您可以使用GetIpNetTable等来访问它

我希望有一个API来回答这两个问题:

  • 我如何从IP转换到MAC地址? (ARP)
  • 我如何从MAC转换到IP地址? (InARP时)

如果没有,那么我可能不得不手动做更多的事情:

  • 我如何读取内核的ARP表?
  • 如果我自己确定了一个映射,如何添加条目?

的/ proc /净/ ARP

ķ

ARP表往往是相当地方和短暂的。 如果您检查协议,则通常只在给定的IP地址位于本地子网中时才提供真正的MAC地址。 否则,数据包被转发到本地路由器,然后负责转发它。

如果你在Windows上使用“ arp -g ”或者在UNIX上使用“ arp -a ”,你会看到这个表,但是由于上面提到的原因,我认为这对你没有好处。 那个命令和

这是真正的DNS,但是,正如你所说,它可能不适合你。

您可能必须在应用程序级别编写自己的“ARP​​”数据库。

至于ARP:
你可以使用system(“/ usr / bin / arp -option_of_choice”); 并解析输出,但这是一个丑陋的黑客。 – 不是我的建议。

查看/usr/include/linux/sockios.h – 在SIOCGARP,SIOCDARP和SIOCSARP详细信息中。 这些是你可以在Linux上管理ARP表的ioctls。 当然,你将不得不在socket fd上执行这些ioctl。 以下是一些示例: SIOCGARP示例
我相信你可以在其他几种语言中找到许多其他的例子。 我假设你正在使用C.

至于RARP:
Linux rarp联机手册的一句话是:“这个程序已经过时了,从2.3版本开始,Linux内核不再包含RARP支持。对于一个替代的RARP守护进程,请参阅ftp://ftp.demenatia.org/pub/net-工具”
所以你必须在目标系统上安装rarpd。