为什么wireshark接收到udp广播报文,而socket侦听器没有接收到?

本文关键字:侦听器 socket 报文 wireshark udp 广播 为什么 | 更新日期: 2023-09-27 18:08:59

我有一个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上,而不是在我的应用程序中吗?

为什么wireshark接收到udp广播报文,而socket侦听器没有接收到?

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

当我将网卡的子网掩码更改为255.255.255.0而不是255.255.252.0时,我的回调开始被调用。

我不确定为什么wireshark可以看到流量,而不是UdpClient,但这个变化似乎产生了差异。

为了捕获传入数据,必须结束异步接收流程。当你调用_client.BeginReceive()时,它会生成一个为你接收传入数据的线程。为了捕获这些数据,您应该将以下代码添加到ReceiveCallback中。然后你就可以在你认为合适的时候使用传入的字节[]。

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