Как прослушать широковещательные пакеты на любом порту? - PullRequest
5 голосов
/ 05 августа 2009

Используя .NET, как я могу прослушивать широковещательные пакеты udp, отправленные на .255 на любой порт без необходимости привязки к определенному порту?

Ответы [ 3 ]

6 голосов
/ 07 августа 2009

Я нашел способ сам. Вот как это работает:

mainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
mainSocket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.1"), 0));
mainSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);                           

byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
byte[] byOut = new byte[4] { 1, 0, 0, 0 }; 

// Socket.IOControl is analogous to the WSAIoctl method of Winsock 2
mainSocket.IOControl(IOControlCode.ReceiveAll, //Equivalent to SIO_RCVALL constant of Winsock 2
    byTrue,
    byOut);

//Start receiving the packets asynchronously
mainSocket.BeginReceive(byteData,0,byteData.Length,SocketFlags.None,new AsyncCallback(OnReceive),null);

В асинхронном обработчике я выполняю mainSocket.EndReceive (...), анализирую данные и запускаю новый BeginReceive, если требуется (управляется извне многопоточного приемника).

Работает как шарм. Кредиты идут в Хитеш Шарма (http://www.codeproject.com/KB/IP/CSNetworkSniffer.aspx)

4 голосов
/ 05 августа 2009

Я думаю, что для этого вам нужно быть ниже уровня UDP.

Если бы я действительно хотел сделать это, я бы начал с загрузки анализатора пакетов с открытым исходным кодом / сетевого анализатора ( Ethereal.com * приходит на ум) и просмотрел источник, чтобы увидеть, как они читают пакеты. .

Глядя дальше, я нашел немало информации о перехвате пакетов на tcpdump.org .

Извините, я не могу дать конкретные фрагменты кода, я всегда хотел привязать к определенному порту.

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

Вам нужно будет использовать WinPCap или аналогичный для перехвата пакетов на канальном уровне, а затем фильтровать для широковещательной рассылки UDP. Извините, я не думаю, что для этого есть API более высокого уровня.

...