【发布时间】: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 并且似乎没有替代方案。
我不确定我还能如何理解这一点。重点不在于如何发现或安装设备。
【问题讨论】:
-
什么是嵌入式设备,您希望它能在企业环境中工作吗?