对于一系列嵌入式设备的配置软件,我们必须通过IP地址查找设备。对于任何给定的IPv4地址,我们需要
我不确定最好的办法是什么。起初,我们尝试只调用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上没有该功能?
为了做到这一点,我既没有设计设备也没有设计部署过程。对于这个问题,只需假设
这意味着我可能在构建A(MAC地址A)中有IP 192.168.0.100,然后将计算机连接到构建B,它也具有IP 192.168.0.100,但这次是它的MAC地址B.用户说“连接到192.168.0.100”,我们必须确保192.168.0.100不仅可以访问,而且实际上是MAC B而不是MAC A.我认为ResolveIpNetEntry2实际上会让我这样做,但它在Windows上不可用XP并没有替代品。
我不确定我怎么能理解这一点。重点不在于如何发现或安装设备。
答案 0 :(得分: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地址。我建议你为你使用的每个操作系统测试这个,因为可能会有关于访问缓存的变幻莫测。
答案 1 :(得分:1)
我过去在类似情况下所做的是Ping到所需的地址,然后从C#applitacion执行arp命令以获得所需的MAC。
每当您需要访问MAC时,请刷新它以执行此过程。