.NETを使用して、特定のポートにバインドすることなく、任意のポートで.255に送信されたudpブロードキャストパケットをリッスンするにはどうすればよいですか?
3 に答える
私は自分で方法を見つけました。これがどのように機能するかです:
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 )に送られます。
これを達成するには、UDP よりも低いレベルである必要があると思います。
本当にこれをやりたいと思ったら、まずオープン ソースのパケット スニファ/ネットワーク アナライザー ( Ethereal.comが思い浮かびます) をダウンロードし、ソースを精査して、パケットがどのように読み取られるかを確認します。
さらに調べてみると、 tcpdump.orgでパケット キャプチャに関する情報がかなり見つかりました。
申し訳ありませんが、特定のコード スニペットを提供することはできません。私は常に特定のポートにバインドしたいと考えていました。
WinPCapなどを使用して、リンク レベルでパケットを盗聴し、UDP ブロードキャストをフィルタリングする必要があります。申し訳ありませんが、これには高レベルの API はないと思います。