2011-09-20 34 views
0

我有一个C#应用程序可以在多台机器上工作,但由于某种原因,不适用于另一台机器。全部是Windows XP。如何可以通过wireshark接收udp广播数据包但不是套接字监听器

我只需打开一个端口,侦听:

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

“我没有任何错误被抛出。” - 没有尝试/抓住吞咽错误? –

+0

Open方法有一个try块,但catch块会弹出一个消息框,但第一件事是异常。 – John

+0

在异步回调中显示消息框是一个坏主意。对于我们所知道的,它可能实际上被显示,但它隐藏在另一个窗口后面。它不会再次显示,也不会显示EndReceive调用。 –

回答

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

+0

假设有人发送带有255.0.0.0掩码的消息,并且我有255.255.0.0。我的电脑会收到这条消息,但它会被过滤掉,我将无法在我的应用程序中读取它。是否有任何技巧在应用程序中获取此消息? – dmigo

0

您必须结束异步接收过程才能捕获传入数据。当你调用_client.BeginReceive()时,它会产生一个线程来为你接收传入的数据。为了捕获这些数据,您应该将以下代码添加到ReceiveCallback中。然后,您将能够按照您认为合适的方式使用传入的字节[]。

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

+0

感谢您的回复。这实际上是在回调中,为了简洁起见,我刚刚将其留出。 – John

+0

@John - 你永远不会知道!很高兴你发现了这个问题。 – Dubs

2

我的回调开始被调用一次,我改变了网卡的子网掩码255.255.255.0是:

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

此外,您可以通过以下链接参考MSDN上的UdpClient类而不是255.255.252.0。

我不知道为什么wireshark可以看到流量,但不是UdpClient,但这种改变似乎有所作为。

+0

如果你正在回答你自己的问题,你应该接受这个答案。 –

+0

我会尽快让网站让我。显然,在你做到这一点之前,有一个24小时的冷静期。 – John

相关问题