首先,我知道UDP是网络层上不可靠的传输机制,不,我不能将应用程序切换到TCP。现在我们已经解决了这个问题。...
我遇到一个问题,即我似乎无法以看到所有接收到的数据包的方式将UDP客户端中的数据读取到应用程序中。我可以使用Wireshark验证数据包是否已到达计算机,从而消除了网络可靠性问题。我已经从代码中删除了几乎所有内容,实际上它所做的只是计数数据包,而我仍然无法从Wireshark获取数据包的数量,以使其与我在应用程序中计算的数据包的数量保持一致。我已经尝试了所有可以在Web上找到的内容,包括增加缓冲区大小,以避免填满内核缓冲区(这似乎没有效果)。 UdpClient需要能够发送广播和单播数据包,但只需要处理单播响应。
当在短时间内处理来自不同端点的大量单播响应时,该问题就会显现出来。 (约1秒内达到200)。如果响应的间隔更大,则没有问题,但是我无法控制接收器。
我很抱歉代码很草率,因为我一直在尝试各种方法来解决该问题,但没有成功(很明显)。
创建客户端的代码:
UdpClient Udp = new UdpClient();
Udp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, 0x4000);
Udp.ExclusiveAddressUse = false;
Udp.EnableBroadcast = true;
Udp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
Udp.Client.Bind(new IPEndPoint(A, 12345));
ReceiveDataAsync(Udp, ReceiveDataCallback);
用于处理数据的代码(再次,仅对数据包进行计数):
private static void ReceiveDataAsync(UdpClient Client, Action<UdpClient, UdpReceiveResult> Callback)
{
Thread T = new Thread(() =>
{
try
{
while (true)
{
try
{
IPEndPoint E = new IPEndPoint(IPAddress.Any, 12345);
byte[] Data = Client.Receive(ref E);
PacketsFound += 1;
}
catch (SocketException)
{
// Do nothing, triggered when we get ICMP unreachable.
}
}
}
catch (ObjectDisposedException)
{
// Do nothing
}
catch (NullReferenceException)
{
// Also do nothing. Seems to fire when disposed and callback is still waiting.
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\r\n\r\n" + ex.StackTrace, ex.GetType().ToString());
}
});
T.IsBackground = true;
T.Priority = ThreadPriority.Highest;
T.Start();
}
预先感谢您的帮助。