如何将 MAC 地址转换为对应的 IP 地址?
Posted
技术标签:
【中文标题】如何将 MAC 地址转换为对应的 IP 地址?【英文标题】:How to convert a MAC address to the corresponding IP address? 【发布时间】: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 淘汰 【参考方案1】:没有好的通用解决方案,因为它与预期行为相反。较低级别的协议不需要知道较高层的协议,因此 MAC 层的操作没有任何好的方法来找出 IP 地址。然后你进入你现在所处的情况。因此,您可以像已有的代码一样使用 hack,也可以从不同的方向解决这个问题。有没有什么非代码方式可以事先确定设备的IP地址?例如显式设置或将其放入应用程序的配置文件中。或者,您可以让设备发出虚假的 ARP 请求吗? PC 应根据传入的请求以及对其发出的请求的响应来更新其 ARP 缓存。
【讨论】:
谢谢你,克里斯。不幸的是,您的答案是我所期望的 :-) 我上面提到的仪器是一个定制的电路,上面有一个 FPGA。由于FPGA由于某些原因随机生成IP地址,我所知道的只是MAC地址。实际上,我(将)拥有数百个这种设备。所以我想避免重复我的肮脏黑客数百次。我会向 FPGA 代码的开发者询问发送 ARP 请求的可能性。 几年前我曾研究过类似的问题。我们的设备具有用户分配的地址,可以在网络上进出。我们所做的是让每个设备在特定的 UDP 端口上侦听特定字符串。如果它收到该字符串,它会以一个标识符进行响应。这样我们就可以向每个地址发送 UDP 数据包,然后被动地收集响应以查看哪些设备处于活动状态。如果你有一堆这样的东西,这可能是一个选择。【参考方案2】:不久前我们不得不这样做,但我认为我们不能正常工作。
我没有即时调用 API,但在 Windows API 中很容易找到它们。这就是我们使用的,因此我们的解决方案不能移植到非 Windows 系统。
在我们的案例中,我们遇到了同样的障碍——翻译并不容易。我们最终要做的是获取所有可用 NIC 的列表,然后循环遍历每一个,尝试将我们给定的 MAC 地址与从 NIC 结构中获得的 MAC 地址进行匹配。
一旦找到匹配项,我们就会查找分配给 NIC 结构的 IP 地址。
我们继续查看是否找到任何其他匹配项以记录错误。我们做了一件好事,因为我相信我们确实多次找到它,而不是因为 MAC 地址被克隆。
那时我们了解到这将是一个更加困难的问题,因此我们决定放弃整个事情并只使用 IP 地址。
【讨论】:
【参考方案3】:试试c++
中的系统命令arp
怎么样
system("arp");
这为您提供了一个 IP-MAC 转换表。
【讨论】:
是的,但他必须先填充该表,这是他列出的代码正在尝试做的事情。 @xb。换句话说,我想知道如何在不重复 ping 或类似命令的情况下填充 ARP 缓存。 @AkiraOkumuraarp
给我一个当前连接机器的 IP-MAC 表,而不执行任何 ping
命令。我正在运行 Linux。
@xb。谢谢你们的cmets。我使用的设备不一般。在我从 PC (192.168.0.1) 向它发送数据包之前,它不会发送任何数据包。这就是为什么在我发送 ping 之前没有填充 ARP 缓存的原因。我应该澄清这一点。
@AkiraOkumura 提防这种类型的系统很好:)【参考方案4】:
几天前我也遇到了这个问题,但经过多次努力,我在下面得到了解决方案 MAC 到 IP 地址转换器工具的工作原理是什么? 这个MAC address converter可以将MAC地址转换为IPv4 IP地址,并将MAC地址转换为IPv6 IP地址,这些互联网协议地址非常常用。它将 MAC 地址作为输入字符串,并针对给定的 MAC 到 IP 地址和 MAC 转换选项(例如从 MAC 到 IPV6 或从 MAC 到 IPV4 或两者)生成查询,以便一起进行 MAC 地址转换。在此 MAC 转换之后,您还可以使用 IPv6 to IPv4 将 MAC 恢复为 IP 转换更改。查询根据所选选项生成输出响应。如果插入任何无效输入,则会产生无效输入消息响应
【讨论】:
以上是关于如何将 MAC 地址转换为对应的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章
用c#处理下面字符串,将字符串中的ip地址对应mac录入到dataset中 字符串如下:
获取ip地址对应的mac地址,c/c++编程实现,linux下
在C语言中,如何将字符串“192.168.1.1”转换成MAC地址或IP地址?