使用.NET,如何在任何端口上监听发送到.255的udp广播数据包,而无需绑定到特定端口?
答案 0 :(得分: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)
答案 1 :(得分:4)
我认为你需要比UDP更低级才能实现这一目标。
如果我真的想这样做,我首先要下载一个开源数据包嗅探器/网络分析器(Ethereal.com),并仔细阅读源代码来了解他们如何读取数据包。
进一步观察,我在tcpdump.org发现了很多关于数据包捕获的内容。
抱歉,我无法提供具体的代码片段,我一直想绑定到特定的端口。
答案 2 :(得分:0)
您需要使用WinPCap或类似内容在链接级别嗅探数据包,然后过滤UDP广播。对不起,我认为没有任何更高级别的API。