3

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

因此,我被指示使用硬件地址和 ARP 进行调查。这会起作用,但我不想重复代码。内核必须管理一个 ARP 表。在 Windows 上,您可以使用GetIpNetTable等访问它。

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

  • 如何从 IP 转换为 MAC 地址?(ARP)
  • 如何从 MAC 转换为 IP 地址?(InARP)

如果没有,那么我可能不得不手动进行更多操作:

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

3 回答 3

1

/proc/net/arp

ķ

于 2009-01-21T00:50:51.450 回答
1

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

如果您arp -g在 Windows 上执行“”或arp -a在 UNIX 上执行“”,您会看到该表,但由于上述原因,我认为这对您没有任何好处。该命令和

这确实是 DNS 的用途,但正如您所说,它可能不是您的选择。

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

于 2009-01-21T00:51:29.030 回答
1

至于 ARP:
您可以使用 system("/usr/bin/arp -option_of_choice"); 并解析输出,但这是一个丑陋的黑客。——不是我的推荐。

查看 /usr/include/linux/sockios.h —— SIOCGARP、SIOCDARP 和 SIOCSARP 详细信息。这些是您可以执行以管理 linux 上的 ARP 表的 ioctl。当然,您必须在套接字 fd 上执行这些 ioctl。以下是一些示例: SIOCGARP 示例
我相信您也可以找到许多其他语言的示例。正如我假设你正在使用 C.

至于 RARP:
引用 linux rarp 手册页:“该程序已过时。从 2.3 版开始,Linux 内核不再包含 RARP 支持。有关替代 RARP 守护程序,请 参见ftp://ftp.dementia.org/ pub/net-tools"
所以你必须在目标系统上安装 rarpd。

于 2009-01-21T05:55:34.783 回答