Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# wireshark如何接收udp广播数据包而不是套接字侦听器_C#_Udpclient - Fatal编程技术网

C# wireshark如何接收udp广播数据包而不是套接字侦听器

C# wireshark如何接收udp广播数据包而不是套接字侦听器,c#,udpclient,C#,Udpclient,我有一个C#应用程序,可以在几台机器上运行,但由于某些原因不能在另一台机器上运行。都是Windows XP 我只需打开一个端口,然后聆听: void Open() { var myIpAddress = UdpComm.GetPcIpAddress(target); listenEndPoint = new IPEndPoint(myIpAddress, RemotePort); System.Windows.Forms.MessageBox.Show("Creating listener

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

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

IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] incomingBytes = _client.EndReceive(ar, ref endPoint);
此外,您可以通过以下链接引用MSDN上的UdpClient类:


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

IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
byte[] incomingBytes = _client.EndReceive(ar, ref endPoint);
此外,您可以通过以下链接引用MSDN上的UdpClient类:


当我将NIC的子网掩码从255.255.252.0更改为255.255.255.0后,我的回调开始被调用


我不知道为什么wireshark可以看到流量,但看不到UdpClient,但这一更改似乎起了作用。

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


我不知道为什么wireshark可以看到流量,但看不到UdpClient,但这一变化似乎起了作用。

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

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

“我没有抛出任何错误。”-没有try/catch的吞咽错误?Open方法有一个try块,但catch块会弹出一个消息框,但首先出现异常。在异步回调中显示消息框是个坏主意。据我们所知,它实际上可能会显示出来,但它隐藏在另一个窗口后面。它也不会再次显示,没有EndReceive调用。“我没有抛出任何错误。”-没有try/catch的吞咽错误?Open方法有一个try块,但catch块会弹出一个消息框,首先出现异常。在异步回调中显示消息框是个坏主意。据我们所知,它实际上可能会显示出来,但它隐藏在另一个窗口后面。它也不会再显示,没有EndReceive呼叫。谢谢回复。这实际上是在回拨中,为了简洁起见,我把它省略了。@John-你永远不知道!很高兴你发现了问题。谢谢你的回复。这实际上是在回拨中,为了简洁起见,我把它省略了。@John-你永远不知道!很高兴你发现了这个问题。如果你是在回答自己的问题,你应该接受这个答案。我会在网站允许的情况下尽快这样做。显然,在你能做到这一点之前,有一个24小时的冷静期。如果你回答自己的问题,你应该接受这个答案。我会在网站允许的情况下尽快这样做。显然,在你做这件事之前,有一个24小时的冷静期。比如说有人发送了一条带有255.0.0.0掩码的消息,我有255.255.0.0掩码。我的电脑将收到该消息,但它将被过滤掉,我将无法在我的应用程序中读取它。在应用程序中获取此消息有什么诀窍吗?假设有人发送了带有255.0.0.0掩码的消息,而我有255.255.0.0掩码。我的电脑将收到该消息,但它将被过滤掉,我将无法在我的应用程序中读取它。在应用程序中获取此消息有什么诀窍吗?