5

.NETを使用して、特定のポートにバインドすることなく、任意のポートで.255に送信されたudpブロードキャストパケットをリッスンするにはどうすればよいですか?

4

3 に答える 3

6

私は自分で方法を見つけました。これがどのように機能するかです:

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 を開始します (マルチスレッド レシーバーの外部から制御されます)。

魅力のように機能します。クレジットは Hitesh Sharma ( http://www.codeproject.com/KB/IP/CSNetworkSniffer.aspx )に送られます。

于 2009-08-07T10:21:00.753 に答える
4

これを達成するには、UDP よりも低いレベルである必要があると思います。

本当にこれをやりたいと思ったら、まずオープン ソースのパケット スニファ/ネットワーク アナライザー ( Ethereal.comが思い浮かびます) をダウンロードし、ソースを精査して、パケットがどのように読み取られるかを確認します。

さらに調べてみると、 tcpdump.orgでパケット キャプチャに関する情報がかなり見つかりました。

申し訳ありませんが、特定のコード スニペットを提供することはできません。私は常に特定のポートにバインドしたいと考えていました。

于 2009-08-05T14:02:32.767 に答える
0

WinPCapなどを使用して、リンク レベルでパケットを盗聴し、UDP ブロードキャストをフィルタリングする必要があります。申し訳ありませんが、これには高レベルの API はないと思います。

于 2009-08-05T14:13:04.907 に答える