0

我有一个 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 上但不在我的应用程序中的任何想法?

4

3 回答 3

2

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

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

于 2011-09-20T20:46:03.070 回答
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

于 2011-11-30T16:10:19.130 回答
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

于 2011-09-20T00:40:01.467 回答