Определите MAC-адрес следующего перехода в C # - PullRequest
0 голосов
/ 26 августа 2009

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

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

есть менее запутанный способ сделать это.

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

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

Ответы [ 3 ]

2 голосов
/ 31 августа 2009

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

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

После этого вы можете найти сам NIC, выполнив поиск этого идентификатора в списке, возвращаемом GetAdaptersInfo .

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

0 голосов
/ 26 августа 2009

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

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

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

0 голосов
/ 26 августа 2009

Физические адреса разрешаются протоколом Address Resolution - просто отправьте ARP Reuest с IP-адресом для разрешения.

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

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