Для программного обеспечения для настройки ряда встроенных устройств мы должны найти устройства по IP-адресу. Для любого данного IPv4-адреса нам нужно
- узнать MAC-адрес (поскольку MAC-адрес может быть отфильтрован)
- выяснить, доступно ли устройство, т. Е. Проверить его.
Я не уверен, что лучший способ сделать это. Сначала мы пытались просто вызвать SendARP
, и он работает довольно хорошо, но он использует только кеш, если IP-адрес уже существует, и, похоже, нет способа обойти это (кроме очистки всего кеша, которая является привилегированной операцией). Это означает, что мы должны сделать второй шаг и просто пропинговать устройство (я думаю, что мы должны сначала пропинговать его, затем вызвать SendARP
, если оно было достижимо), но это как-то слишком много, если устройство достижимо. Или правильный адрес уже будет в кеше ARP, если пинг прошел успешно? IP-адрес может относительно часто менять свой соответствующий MAC-адрес, потому что разные устройства подключены в отдельной сети, поэтому я думаю, что мы должны форсировать фактический запрос ARP.
Альтернатива, которую я могу придумать, - это звонить ResolveNeighbor
/ ResolveIpNetEntry2
. По крайней мере, документация по последнему, кажется, нам нужна (очистите кэш ARP для этого IP-адреса и отправьте реальный запрос), но это только Vista или более поздняя версия. В XP нам нужно было бы вызвать ResolveNeighbor
, что проще, но больше не задокументировано. Это включает проверку правильности выбранной функции (или просто вызов ResolveNeighbor
, а в случае сбоя, что задокументировано для выполнения в Vista или новее, вызов ResolveIpNetEntry2
).
Я просто не уверен, какой будет лучший способ, или я что-то упустил. Чтобы вы посоветовали? Обратите внимание, что я бы также взял чистое решение .NET, если оно есть;)
Обновление
Кажется, что ResolveNeighbor, несмотря на то, что он задокументирован, не существует в Windows XP, по крайней мере, в IPhlpapi.dll. Означает ли это, что функциональность недоступна в XP?
Проще говоря, я не проектирую ни устройства, ни процесс развертывания. Для этой проблемы просто предположим, что
- все устройства уже имеют IP-адреса и
- компьютер находится в той же подсети, но не обязательно принадлежит сети (т. Е. Это портативный компьютер) и
- IP-адрес известен при запуске инструмента, т. Е. Пользователь может ввести их или прочитать их из файла конфигурации и
- тот же компьютер, возможно, даже без перезапуска инструмента, использовался всего за несколько секунд до подключения к совершенно другой сети с теми же IP-адресами, например, к другому зданию, расположенному одинаково.
Это означает, что у меня может быть IP 192.168.0.100 в здании A, который является 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, и, кажется, альтернативы этому нет.
Я не уверен, как еще я могу донести эту мысль. Дело не в том, как обнаружить или установить устройства.