2009-08-05 6 views
5

.NETを使用すると、特定のポートにバインドする必要なく、どのポートで.255に送信されたudpブロードキャストパケットを聞くことができますか?どのポートでブロードキャストパケットをリッスンするか?

+0

バインディングの性質がこのシナリオを明示的に防止すると思いますが、Stack Overflowは私には分かりませんでした。この回答をお待ちしています... – grenade

答えて

4

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

私が実際にやりたかったのは、オープンソースのパケットスニッファ/ネットワークアナライザ(Ethereal.com)をダウンロードし、ソースを調べてパケットの読み方を調べることです。

さらに見ると、パケットキャプチャについては、tcpdump.orgでかなりわかりました。

申し訳ありませんが、特定のコードスニペットを付けることはできません。私はいつも特定のポートにバインドしたかったのです。

0

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

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

関連する問題