Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将MAC地址转换为相应的IP地址?_C++_C_Sockets_Networking - Fatal编程技术网

C++ 如何将MAC地址转换为相应的IP地址?

C++ 如何将MAC地址转换为相应的IP地址?,c++,c,sockets,networking,C++,C,Sockets,Networking,我正在寻找一种简单的方法,将MAC地址转换为本地网络中相应的IP地址。在我的例子中,只有两个设备:一个非常普通的PC(192.168.0.1)和一个科学仪器,它的ROM中有一个硬编码的任意IP地址(192.168.0.xxx)。PC和仪器通过一个带有CAT5电缆的UDP插座直接连接 我知道仪器的MAC地址,但请假定其IP地址未知。我想编写一个C/C++应用程序,它使用套接字连接与仪器进行对话。但是在打开套接字之前,我需要知道IP地址(Windows上的WinSock,OS X和Linux上的sy

我正在寻找一种简单的方法,将MAC地址转换为本地网络中相应的IP地址。在我的例子中,只有两个设备:一个非常普通的PC(192.168.0.1)和一个科学仪器,它的ROM中有一个硬编码的任意IP地址(192.168.0.xxx)。PC和仪器通过一个带有CAT5电缆的UDP插座直接连接

我知道仪器的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地址的方法。

    c++

    system("arp");
    

    这将为您提供一个IP-MAC转换表。

    没有好的通用解决方案,因为它与预期行为相反。较低级别的协议不需要知道较高层的协议,因此MAC层的操作没有任何好的方法来了解IP地址。然后你就进入了你现在的处境。因此,您可以使用类似现有代码的黑客,也可以从不同的方向解决此问题。是否有任何非代码方式来确定设备的IP地址?例如显式设置或将其放入应用程序的配置文件中。或者,您可以让设备发送虚假的ARP请求吗?电脑应该根据传入的请求以及对请求的响应来更新其ARP缓存。

    我们前一段时间不得不这样做,但我认为我们没有让它正常工作

    我手头没有API调用,但它们很容易在Windows API中找到。这就是我们所使用的,所以我们的解决方案不能移植到非Windows系统

    在我们的例子中,我们遇到了同样的障碍——不容易翻译。我们最终要做的是得到所有可用NIC的列表,然后循环遍历每个NIC,试图将给定的MAC地址与从NIC结构获得的MAC地址相匹配

    找到匹配项后,我们会查找指定给NIC结构的IP地址

    我们继续查看是否找到了其他匹配项,以便记录错误。这是我们做的一件好事,因为我相信我们确实多次找到了它,这并不是因为一个MAC地址被克隆


    就在那时,我们了解到这将是一个更加困难的问题,我们决定放弃这一切,只保留IP地址。

    几天前,我也面临着这个问题,但经过多次努力,我得到了下面的解决方案 MAC到IP地址转换器工具如何工作?
    这可以将MAC地址转换为IPv4 IP地址,并将MAC地址转换为IPv6 IP地址,这些internet协议地址非常常用。它将MAC地址作为输入字符串,并针对给定的MAC-to-IP地址和MAC转换选项(如MAC-to-IPV6或MAC-to-IPV4)生成查询,以便同时进行MAC地址转换。在此MAC转换之后,您还可以使用恢复MAC到IP转换的更改。查询根据所选选项生成输出响应。如果插入任何无效输入,将生成无效输入消息响应

    ,称为RARP-反向ARP@VioletGiraffe这只是提供dhcp功能的一个过时的变体-它对op没有帮助。基本上,我们必须做op已经做的事情,ping整个范围并搜索ARP缓存-除非仪器提供了一种特定的方法来了解其IP地址。@no:dhcp与它有什么关系?RARP正是OP要求的。我认为,如果具有MAC地址的网络设备没有IP地址,RARP用于从RARP服务器获取IP地址。我想这就是@nos写“dhcp功能”的原因。但在我的例子中,网络设备有一个IP地址,它在ROM上是硬编码的。此外,我的网络中没有RARP服务器。@violet giraffe请在转储之前阅读您自己的链接,它在介绍中提到RARP被BOOTP/dhcp淘汰,但他必须先填充该表,这就是他列出的代码要做的。@xb。换句话说,我想知道如何在不重复ping或类似命令的情况下填充ARP缓存。@AkiraOkumura
    ARP
    为我提供了当前连接机器的IP-MAC表,而不执行任何
    ping
    命令。我正在运行Linux。@xb。谢谢你的评论。我使用的设备不是普通的。在我从PC(192.168.0.1)向它发送数据包之前,它不会发送任何数据包。这就是为什么在我发送ping之前没有填充ARP缓存。我应该澄清一下。@AkiraOkumura小心这种类型的系统很好:)谢谢你,克里斯。你的答案正是我所期望的,不幸的是:-)我上面提到的仪器是一个定制的电路,上面有一个FPGA。由于某些原因,FPGA随机生成IP地址,我只知道MAC地址。实际上,我(将)拥有数百台这种设备。所以我想避免重复我的肮脏的黑客数百次