【发布时间】:2014-03-13 00:41:13
【问题描述】:
我正在寻找一种将 MAC 地址转换为本地网络中相应 IP 地址的简单方法。在我的例子中,只有两个设备:一个非常普通的 PC (192.168.0.1) 和一个在其 ROM 中硬编码的具有任意 IP 地址 (192.168.0.xxx) 的科学仪器。 PC 和仪器通过 UDP 插口使用 CAT5 电缆直接连接。
我知道仪器的 MAC 地址,但请假设它的 IP 地址未知。我想编写一个 C/C++ 应用程序,它使用套接字连接与仪器对话。但在打开套接字之前我需要知道 IP 地址(Windows 上的 WinSock,OS X 和 Linux 上的 sys/socket)。
目前我使用的方式很脏,如下图。
- 执行ping命令
ping 192.168.0.2(注意:仪器不响应ping) - 从 192.168.0.2 到 192.168.0.255 重复此操作
- 执行
arp -a打印 IP 和 MAC 地址列表 - 从列表中查找已知的MAC地址和对应的IP地址
我想知道如何以更复杂的方式检索 IP 地址。如果我可以在 Mac、Linux 和 Windows 机器上使用相同的方法,那就太好了。
据我所知,我必须向网络广播一个 ARP 数据包,以便从已知 IP 地址中检索 MAC 地址。但我找不到从 MAC 地址获取 IP 地址的方法。
【问题讨论】:
-
这就是所谓的 RARP - 反向 ARP。 en.wikipedia.org/wiki/Reverse_Address_Resolution_Protocol
-
@VioletGiraffe 这只是提供 dhcp 功能的过时变体 - 它不会帮助操作。基本上必须做 OP 已经做的事情,ping 整个范围并搜索 ARP 缓存 - 除非仪器提供了一种特定的方式来了解其 IP 地址。
-
@nos:DHCP 与它有什么关系? RARP 正是 OP 要求的。
-
我认为,如果具有 MAC 地址的网络设备没有 IP 地址,则使用 RARP 从 RARP 服务器获取 IP 地址。我想这就是@nos 写“dhcp 功能”的原因。但就我而言,网络仪器有一个 IP 地址,该地址是硬编码在其 ROM 上的。另外,我的网络中没有 RARP 服务器。
-
@violet giraffe 请在转储之前阅读您自己的链接,它在介绍中谈到了 rarp 已被 BOOTP/DHCP 淘汰
标签: c++ c sockets networking