2009-08-05 34 views
5

使用.NET,我怎样才能在任何端口上监听发送到.255的udp广播数据包,而无需绑定到特定的端口?如何监听任何端口上的广播数据包?

+0

我认为绑定的本质明确地阻止这种情况,但堆栈溢出告诉我,我从来不知道的各种事情。等待听到这个答案... – grenade 2009-08-05 13:11:44

回答

4

我认为你需要比UDP更低的水平来实现这一点。

如果我真的想这样做,我首先要下载一个开源的数据包嗅探器/网络分析器(想到Ethereal.com)并仔细阅读源代码,看看它们如何读取数据包。

进一步看,我在tcpdump.org发现了很多关于数据包捕获的内容。

对不起,我不能给出特定的代码片段,我一直想绑定到特定的端口。

0

您需要使用WinPCap或类似的方法来在链路级嗅探数据包,然后过滤UDP广播。对不起,我不认为有这个更高级别的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夏尔马(http://www.codeproject.com/KB/IP/CSNetworkSniffer.aspx