Отправьте IP-пакет с помощью Packet.Net и SharpPcap, но сгенерируйте кадр Ethernet

Я пытаюсь отправить необработанный пакет UDP с помощью Packet.Net, но функция device.SendPacket (), похоже, принимает только PDU уровня канала, что означает, что я должен сам определить MAC-адреса источника и назначения. (Используя ARP или что-то в этом роде)

Как я могу создать IP-пакет с помощью Packet.Net, но сгенерировать для меня правильный кадр Ethernet?


person takteek    schedule 30.01.2012    source источник
comment
Поскольку вы используете UDP, есть ли причина, по которой вы не хотите просто отправлять его как обычно и позволять нижним уровням обрабатывать все это за вас?   -  person Brad    schedule 30.01.2012
comment
@Brad Моя текущая причина заключается в том, что мне нужно отправить данные с порта, который уже привязан к текущему компьютеру, и я не мог найти способ сделать это с .Net без исключения исключений. Позже мне, вероятно, тоже понадобится больше контроля.   -  person takteek    schedule 30.01.2012
comment
@takteek - есть опция сокета, позволяющая несколько привязок к одному и тому же порту. У вас должна быть возможность установить socket.ExclusiveAddressUse = false; для этого.   -  person M.Babcock    schedule 30.01.2012
comment
@takteek - Также, если вы собираетесь пройти через боль, связанную с управлением этим с помощью Packet.NET или SharpPCAP, тогда зачем вообще связывать порт?   -  person M.Babcock    schedule 30.01.2012


Ответы (1)


Вам нужно будет знать Mac-адрес назначения. Как вы предложили, лучший подход - использовать arp для обнаружения MAC-адреса. Адрес источника вы можете получить от самого адаптера. В исходных версиях sharppcap и packet.net есть примеры как для пакетов arp, так и для пакетов сборки.

Крис

Автор sharppcap / packet.net

person Chris Morgan    schedule 30.01.2012
comment
Хорошо, тогда считайте это запросом функции. : P Это устройство немного сбивает с толку. SendPacket принимает пакеты сетевого уровня без жалоб, но затем не может их отправить. Может, это стоит назвать SendFrame или что-то в этом роде. - person takteek; 31.01.2012
comment
О, я понимаю, что ты имеешь в виду. Что, если бы SendPacket () был изменен так, чтобы принимать только пакеты типа InternetLinkLayerPacket? Это будет включать Ethernet, LinuxSLL и Ieee80211.RadioPacket и Ieee80211.PpiPacket. Это, по крайней мере, проясняет, какой тип пакета нужно передать, и позволяет избежать такого состояния. - person Chris Morgan; 31.01.2012
comment
Было бы также полезно, если бы вы могли сгенерировать EthernetPacket из IpPacket? Это может быть что-то, что могло бы выполнять Arp и т. Д. Это должно быть частью SharpPcap, а не Packet.Net, поскольку SharpPcap обрабатывает устройства, Packet.Net обрабатывает парсинг пакетов и т. Д. Может быть какая-то служебная функция, которая будет принимать IpPacket и выполнять Arp, то вернуть встроенный EthernetPacket? Не уверен, что он слишком специализирован, поскольку метод ARP.Resolve () довольно прост, и на самом деле в EthernetPacket есть только три поля для заполнения: src, dest и PayloadPacket. - person Chris Morgan; 31.01.2012