对于一系列嵌入式设备的配置软件,我们必须通过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 地址在工具启动时是已知的,即用户可以输入它们或从配置文件中读取它们,并且
- 同一台计算机,甚至可能没有重新启动工具,在几秒钟前被用于连接到具有相同 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 和那里不可用似乎不是这个的替代方案。
我不确定我还能如何理解这一点。重点不在于如何发现或安装设备。