【问题标题】:How can a udp broadcast packet be received by wireshark but not socket listener如何通过wireshark接收udp广播数据包而不是套接字侦听器
【发布时间】:2011-09-20 00:07:09
【问题描述】:

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

【问题讨论】:

  • “我没有抛出任何错误。” - 没有 try/catch 的吞咽错误?
  • Open 方法有一个 try 块,但是 catch 块弹出一个带有异常的消息框,首先。
  • 在异步回调中显示消息框是个坏主意。据我们所知,它实际上可能会显示,但它隐藏在另一个窗口后面。它也不会再次显示,没有 EndReceive 调用。

标签: c# udpclient


【解决方案1】:

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.0.0.0 掩码的消息,而我有 255.255.0.0。我的电脑会收到该消息,但它会被过滤掉,我将无法在我的应用程序中读取它。在应用程序中获取此消息有什么技巧吗?
【解决方案2】:

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

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

【讨论】:

  • 如果您回答自己的问题,您应该接受这个答案。
  • 只要网站允许,我就会这样做。显然,在您这样做之前,有一个 24 小时的冷静期。
【解决方案3】:

您必须结束异步接收过程才能捕获传入数据。当您调用 _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

【讨论】:

  • 感谢您的回复。这实际上是在回调中,为了简洁起见,我只是将其省略了。
  • @John - 你永远不知道!很高兴您发现了问题。
猜你喜欢
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多