如何通过wireshark接收udp广播包,而不是socket侦听器

时间:2011-09-20 00:07:10

标签: c# udpclient

我有一个可以在多台机器上运行的C#应用​​程序,但由于某种原因没有在另一台机器上运行。都是Windows XP。

我只是打开一个端口并听取:

void Open() 
{
var myIpAddress = UdpComm.GetPcIpAddress(target);

listenEndPoint = new IPEndPoint(myIpAddress, RemotePort);

System.Windows.Forms.MessageBox.Show("Creating listener: " + target.ToString() + " - " + listenEndPoint.ToString());
_client = new UdpClient(listenEndPoint);
_client.EnableBroadcast = true;
_client.BeginReceive(ReceiveCallback, null);
}

public void ReceiveCallback(IAsyncResult ar)
{
  System.Windows.Forms.MessageBox.Show("Data received");
}

当我运行程序时,我看到Open方法成功运行,并且地址和端口看起来正确。

当我在Wireshark上看到这个时,我也看到正确地从远程地址发送数据,但我从未看到回调中的消息框。

我没有抛出任何错误。有什么可能导致数据出现在Wireshark上的想法,但不在我的应用程序中?

3 个答案:

答案 0 :(得分:2)

一旦我将NIC的子网掩码更改为255.255.255.0而不是255.255.252.0,我的回调就开始被调用。

我不确定为什么wireshark可以看到流量,但不能看到UdpClient,但这种变化似乎有所不同。

答案 1 :(得分:2)

Wireshark捕获所有内容,而您的应用程序仅获取过滤后得到的内容 问题可能在于发件人方面。实质上,子网掩码定义了地址的哪个部分定义了网络和哪个节点。因此,子网掩码为255.255.252.0,网络地址长度为22位 假设您的客户端位于10.0.16.100 \ 22。对于广播目的,保留具有最高可能地址的节点地址。许多应用程序希望网络掩码长度为24位(255.255.255.0),并将广播到10.0.16.255。这是错误的,因为只设置了8个最后一位。此子网中的正确广播地址为10.0.19.255

答案 2 :(得分:0)

您必须结束异步接收过程才能捕获传入数据。当您调用_client.BeginReceive()时,它会生成一个接收传入数据的线程。为了捕获这些数据,您应该将以下代码添加到ReceiveCallback中。然后,您可以根据需要使用传入的byte []。

IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] incomingBytes = _client.EndReceive(ar, ref endPoint);

此外,您可以通过以下链接在MSDN上引用UdpClient类:

http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.endreceive.aspx