Пинг / получение MAC-адреса с IP, игнорирование ARP-кэша - PullRequest
0 голосов
/ 26 марта 2012

Для программного обеспечения для настройки ряда встроенных устройств мы должны найти устройства по 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, и, кажется, альтернативы этому нет.

Я не уверен, как еще я могу донести эту мысль. Дело не в том, как обнаружить или установить устройства.

Ответы [ 2 ]

1 голос
/ 28 марта 2012

То, что я делал в прошлом в подобной ситуации, заключалось в том, чтобы выполнить Ping по требуемому адресу и затем выполнить из приложения C # команду arp, чтобы получить нужный MAC-адрес.

Каждый раз, когда вам нужно получить доступ к MAC, вы обновляете его, выполняя этот процесс.

1 голос
/ 28 марта 2012

IP-адрес может относительно часто менять свой соответствующий MAC-адрес, потому что разные устройства подключены в отдельной сети, поэтому я думаю, что мы должны форсировать фактический запрос ARP.

А?

узнать MAC-адрес (поскольку MAC-адрес может быть отфильтрован)

Для чего?

Я думаю, вам нужно сделать шаг назад, потому что сейчас я думаю, что вы спрашиваете "Мне нужно получить MAC-адрес IP-адреса в другой подсети" . Это невозможно.

Звучит ваша попытка разработать программное обеспечение для управления подключенными к сети устройствами, и вы ищете решение для обнаружения услуг.


Обновление после комментария:
Это программное обеспечение для настройки и обновления сетевых контроллеров автоматизации зданий. Многие из этих устройств будут подключены и удалены с компьютера технического специалиста. К компьютеру технического специалиста может быть подключено несколько устройств с одним и тем же IP-адресом (одно за другим, но не одновременно), поэтому мы не можем полагаться на кэш ARP для определения MAC-адреса. Устройства будут находиться в той же подсети, что и компьютер (т.е. компьютер будет помещен в подсеть устройств для подключения к ним). Если вы знаете другой метод, позволяющий полагаться: а) проверить устройство и б) получить его MAC-адрес, я благодарен:)

То есть ваш процесс состоит из двух этапов?

  • Процесс подготовки, когда устройства подключаются к управляющему компьютеру, обнаруживаются и настраиваются
  • Позднее устройства будут развернуты и подключены к одной подсети с управляющим компьютером.

Устройства поставляются предварительно настроенными с тем же IP-адресом?

Если вы можете пропинговать устройство в той же подсети, кеш arp должен иметь правильный mac адрес. Однако, если сценарий означает, что есть возможность подключения нескольких устройств, конкурирующих за один и тот же IP-адрес, у вас будут проблемы.

Если вы ожидаете, что сможете продавать эти устройства в кампусе, вы не можете полагаться на то, что все устройства находятся в одной подсети или в той же подсети, что и контроллер. Подсети могут быть недоступны между зданиями.

Моим первым предложением для проекта было бы, чтобы устройства получали свои IP-адреса через DHCP и включали имя или адрес контроллера (ов) в качестве опции DHCP. Контроллер реализуется как «сервер». Устройства могут забрать свои конфигурации из контроллера. Устройства могут регистрироваться в контроллере, пока они работают. Множество опций для введения безопасности с подписанием конфигураций. Свидетельство об аутентификации связи и т. Д. И т. Д.


Обновление после обновленного вопроса.

Я не уверен, как еще я могу донести эту мысль. Объяснение сценария - хорошее начало.

Сказать, что Многие из этих устройств будут подключены и удалены с компьютера технического специалиста. - это особый способ описания того, что вы разработали с тех пор.

Я перестану пытаться угадать, что ты делаешь, и я перестану пытаться спасти тебя от себя.

Да, если вы можете успешно пропинговать IP-адрес в той же подсети, тогда кэш ARP должен содержать текущий MAC-адрес для этого IP-адреса. Я бы посоветовал вам проверить это для каждой операционной системы, которую вы используете, так как могут возникнуть проблемы с доступом к кешу.

...