我有一个可以在多台机器上运行的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上的想法,但不在我的应用程序中?
答案 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