Вопрос

Я пишу приложение, которое вводит пакеты, используя Острый колпачок.

Однако, поскольку я создаю пакеты самостоятельно и знаю только IP-адрес получателя, я должен определить физический адрес следующего перехода.Я всегда могу отправить пинг на пульт дистанционного управления IP - адрес, понюхайте его и получите MAC - адрес из понюханного пакета.Тем не менее, я надеялся, что есть менее запутанный способ сделать это в C#.

Очевидно, что получение IP-адреса следующего перехода также будет очень полезно, поскольку затем я могу использовать SendARP для определения его MAC-адреса.

Получения таблицы маршрутизации будет достаточно.Как бы я получил это, используя код?

Это было полезно?

Решение

У меня были некоторые проблемы с WMI (кажется, что невозможно сопоставить индекс интерфейса в Win32_IP4RouteTable с реальным устройством;Документация MSDN неверна, и другие, более хакерские методы не работают на некоторых компьютерах).

Итак, я решил использовать неуправляемый GetBestRoute Получить маршрут, что на самом деле сэкономило мне много времени, потому что позволяет Windows самой принимать решение о маршрутизации и возвращает IP-адрес следующего перехода и идентификатор сетевой карты, ведущий к этому адресу.Это также намного быстрее, чем выполнение запроса к WMI.

Затем вы можете найти саму сетевую карту, выполнив поиск по этому идентификатору в списке, возвращаемом Получите adaptersinfo.

Надеюсь , это поможет ...

Другие советы

Физические адреса разрешаются с помощью Протокол разрешения адресов - просто отправьте АРП Реуест с IP-адресом для разрешения.

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

 NetworkInterface.GetAllNetworkInterfaces()[0].GetIPProperties().GatewayAddresses

Совершенно хакерский способ сделать это состоял бы в том, чтобы запустить команду "arp -a" и прочитать и проанализировать результаты команды (используя АРП кэш, уже хранящийся в Windows).

В противном случае вам необходимо включить ARP в ваш стек протоколов.Вот как работает сама ваша система, чтобы определить, куда отправлять фреймы.Или, наконец, если вы не беспокоитесь о неэффективности, вы можете установить свое назначение Ethernet следующим образом:FF: FF: FF:FF:FF: FF и затопи всех в той же локальной сети, что и ты.Когда что-то ответит или вы получите пакет, кэшируйте его самостоятельно, чтобы иметь правильный MAC-адрес назначения.

Лично я бы причинил вам боль, если бы вы применили подход "затопите всех" в моей сети, но в зависимости от вашей ситуации это может быть довольно простой взлом.Однако выполнение 100% полной реализации стека довольно сложно, поскольку существует множество граничных случаев, которые должны хорошо поддерживаться (например, обработка прокси ARP, безвозмездный ARP и т.д.).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top