【问题标题】:Pinging / getting MAC address from IP, ignoring ARP cache从 IP ping/获取 MAC 地址,忽略 ARP 缓存
【发布时间】:2012-04-10 06:36:41
【问题描述】:

对于一系列嵌入式设备的配置软件,我们必须通过IP地址找到设备。对于任何给定的 IPv4 地址,我们需要

  • 找出MAC地址(因为可以过滤MAC地址)
  • 确定设备是否可达,即 ping 它。

我不确定最好的方法是什么。起初,我们尝试只调用SendARP,它工作得很好,但如果 IP 地址已经存在,它只使用缓存,并且似乎没有办法绕过这个(除了刷新整个缓存,这是一个特权操作)。这意味着我们必须执行第二步,然后 ping 设备(我认为我们应该先 ping 它,如果可以访问,则调用SendARP),但是如果设备可以访问,这似乎是一个太多的步骤。或者如果 ping 成功,正确的地址是否已经在 ARP 缓存中? IP地址可能会相对频繁地更改其对应的MAC地址,因为不同的设备连接在单独的网络中,所以我认为我们必须强制执行实际的ARP请求。

我能想到的替代方法是调用ResolveNeighbor/ResolveIpNetEntry2。至少后者的文档似乎是我们需要的(清除此IP地址的ARP缓存并发送实际请求),但它只是Vista或更高版本。在 XP 上,我们必须调用 ResolveNeighbor,这更简单,但不再记录。这涉及到检查正确的功能(或者只是调用ResolveNeighbor,如果它失败了,它记录在Vista 或更高版本上执行,调用ResolveIpNetEntry2)。

我只是不确定最好的方法是什么,或者我是否遗漏了什么。你会推荐什么?请注意,如果有的话,我也会采用纯 .NET 解决方案;)

更新

似乎 ResolveNeighbor 尽管有文档记录,但在 Windows XP 上并不存在,至少在 IPhlpapi.dll 中不存在。这是否意味着该功能在 XP 上不可用?


为了弄清楚这一点,我既没有设计设备,也没有设计部署过程。对于这个问题,只要假设

  • 所有设备都已经有 IP 地址并且
  • 计算机在同一子网中,但不一定属于网络(即它是技术人员的便携式计算机)并且
  • IP 地址在工具启动时是已知的,即用户可以输入它们或从配置文件中读取它们,并且

这意味着我可能在A楼有IP 192.168.0.100,即MAC地址A,然后将计算机连接到B楼,该楼也有IP 192.168.0.100,但这次是MAC地址B。用户说“连接到 192.168.0.100”,我们必须确保 192.168.0.100 不仅可以访问,而且实际上是 MAC B 而不是 MAC A。我认为 ResolveIpNetEntry2 实际上会让我这样做,但它在 Windows 上不可用XP 并且似乎没有替代方案。

我不确定我还能如何理解这一点。重点不在于如何发现或安装设备。

【问题讨论】:

  • 什么是嵌入式设备,您希望它能在企业环境中工作吗?

标签: .net windows ip arp


【解决方案1】:

IP地址可能会相对频繁地更改其对应的MAC地址,因为不同的设备连接在一个单独的网络中,所以我认为我们必须强制执行一个实际的ARP请求。

嗯?

找出MAC地址(因为可以过滤MAC地址)

结局是什么?

我认为你需要退后一步,因为现在我认为你在问“我需要获取不同子网上的 IP 地址的 MAC 地址”。这是不可能的。

听起来您正在尝试设计软件来管理网络连接设备,并且您正在寻找服务发现解决方案。


评论后更新:
这是一款用于配置和更新联网楼宇自动化控制器的软件。许多这些设备将连接到技术人员的计算机上或从技术人员的计算机上移除。技术人员的计算机上可能有多个具有相同 IP 地址的设备(一个接一个,而不是同时),因此我们不能依靠 ARP 缓存来找出 MAC 地址。设备将与计算机位于同一子网中(即计算机将被放入设备的子网以连接到它们)。如果您知道另一种方法来可靠地 a) ping 设备并 b) 获取其 MAC 地址,我很感激 :)

所以你的过程是两步的?

  • 发现和配置设备连接到控制计算机的分段过程
  • 稍后,设备将被部署并连接到与控制计算机相同的子网。

设备出厂时预配置了相同的 IP 地址?

如果您能够 ping 同一子网上的设备,则 arp 缓存应该具有正确的 mac 地址。但是,如果这种情况意味着有可能插入的多个设备竞争同一个 IP 地址,那么您就会遇到问题。

如果您希望能够将这些设备销售到校园环境中,那么您不能指望所有设备都位于同一子网或与控制器位于同一子网中。建筑物之间可能无法使用子网。

我对设计的第一个建议是让设备通过 DHCP 获取其 IP 地址,并将控制器的名称或地址作为 DHCP 选项包括在内。控制器被实现为“服务器”。设备可以从控制器中获取它们的配置。设备可以在运行时向控制器注册。通过配置签名引入安全性的许多选项。证书认证通讯等。


更新问题后更新。

我不确定我还能如何理解这一点。解释这个场景是一个好的开始。

很多这样的设备将被连接到技术人员的计算机上或从技术人员的计算机上移除。是描述你从那以后详细阐述的内容的一种特殊方式。

我不会再试图猜测你在做什么,也不会再试图从你自己身上拯救你。

是的,如果您可以成功 ping 同一子网上的 IP 地址,那么 ARP 缓存应该包含该 IP 地址的当前 MAC 地址。我建议您针对您使用的每个操作系统进行测试,因为在访问缓存方面可能存在变数。

【讨论】:

  • 这是一款用于配置和更新联网楼宇自动化控制器的软件。许多这些设备将连接到技术人员的计算机上或从技术人员的计算机上移除。技术人员的计算机上可能有多个具有相同 IP 地址的设备(一个接一个,而不是同时),因此我们不能依靠 ARP 缓存来找出 MAC 地址。设备将与计算机位于同一子网中(即计算机将被放入设备的子网以连接到它们)。如果您知道另一种可靠的方法 a) ping 设备并 b) 获取其 MAC 地址,我很感激 :)
  • 我更新了我的问题,也许这会让问题更清楚。但是,您说 如果您能够 ping 同一子网上的设备,arp 缓存应该具有正确的 mac 地址 - 这是否意味着如果我对控制器执行 ICMP ping 并随后执行调用 SendARP,我将可靠地获得正确的 MAC 地址,即使 IP 在片刻之前属于另一个 MAC 地址? (请注意,设备不会随机更改地址,它总是手动完成(;)
  • 如果您对控制器执行 ping 操作并且 ping 成功,然后您从 ARP 缓存中获取 MAC,它将具有回复 ping 的地址的最新 MAC,因此它必须是好的一。
  • @MattH:很抱歉,您似乎认为我只是无知;)我感谢您投入的时间,但对于我正在实施的流程,我真的没有什么可以改变的。它只需要做正确的事[tm]。我刚刚在我的系统上尝试了 Ping,然后是 SendARP,在交换具有相同 IP 地址但不同 MAC 地址的设备时效果很好。如果它在 XP 和 x86 Windows 7 上也能正常工作,我想我有我的解决方案。
  • @OregonGhost:很高兴你找到了一些有用的东西。 你似乎认为我只是无知 - 无知没什么错,这是一个问答网站。如果您对 IP 和以太网有更多的了解,就不会问这个问题。我经常在或接近设计不良的网络连接设备的接收端,令人惊讶的是,有多少网络了解甚少,又有多少实施不力。如果机会出现,我会尝试施加影响。
【解决方案2】:

我过去在类似情况下所做的是 Ping 到所需的地址,然后从 C# 应用程序执行 arp 命令以获取所需的 MAC。

每次您需要访问 MAC 时,您都会刷新它并执行此过程。

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多