快速从UDP接收数据

时间:2018-12-21 16:15:21

标签: c# sockets udpclient

首先,我知道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();
}

预先感谢您的帮助。

0 个答案:

没有答案