繁体   English   中英

C# UdpClient - 侦听器未收到所有发送的数据包

[英]C# UdpClient - Listener not receiving all packets sent

我想创建一个简单的 UdpClient 侦听器进程和一个 UdpClient 发布者进程作为更大规模项目的概念证明。 我创建了一个简单的 UdpClient 侦听器,用于侦听在本地端口上发送的消息。 此侦听器的代码如下。

// UdpMessageReceiver
class Program
    {
        static async Task Main(string[] args)
        {
            const int Port = 5001;
            await UdpListener(Port);
        }

        public static async Task UdpListener(int port)
        {
            var client = new UdpClient(port, AddressFamily.InterNetwork);
            var receivedCount = 0;
            while (true)
            {
                var receivedResult = await client.ReceiveAsync();
                var resultString = Encoding.ASCII.GetString(receivedResult.Buffer);
                receivedCount++;
                Console.WriteLine("Message: " + resultString);
                Console.WriteLine("Current Message Total: " + receivedCount);
            }
        }
    }

我还创建了一个消息发布者,该消息发布者创建消息并将消息发送到我的侦听器正在侦听的同一本地端口,在本例中为端口 5001。消息发布者的代码如下。

class Runner
    {
        public static string Host = "127.0.0.1";
        public static int Port = 5001;

        // The Message class contains an id prop of type int and a packet prop of type byte[]
        public static async Task<ConcurrentBag<Task>> BuildAndExecuteTasksAsync(ConcurrentBag<Message> messages)
        {
            var tasks = new ConcurrentBag<Task>();

            Parallel.ForEach(messages, message =>
            {
                var sendTask = SendUdpMessageAsync(message);
                tasks.Add(sendTask);
            });

            await Task.WhenAll(tasks);

            return tasks;
        }

        public static async Task SendUdpMessageAsync(Message message)
        {
            var client = new UdpClient(Host, Port);
            await client.SendAsync(message._packet, message._packet.Length);
        }
    }

这个片段是我生成要发送的消息列表的方式。

const int NUMBER_OF_MESSAGES = 5000;
var messages = new ConcurrentBag<Message>();

for (int i = 0; i < NUMBER_OF_MESSAGES; i++)
{
     var messageToSend = "Hello World from Id: " + i;
     var packetToSend = Encoding.ASCII.GetBytes(messageToSend);
     messages.Add(new Message(i, packetToSend));
}

上面的代码确实有效。 我启动侦听器,然后运行发布者,侦听器接收所有消息并将其打印到控制台。 当我尝试一次发送大量数据包时,问题就出现了。 侦听器仅接收和处理前 2,700 个左右的数据包。 未收到从发布者发送的所有其他数据包。 我可以做些什么来确保我的听众收到所有数据包,或者我是否需要更改我的消息在发布者中的发送方式?

UDP 消息丢失是正常的。 这不仅发生在 UDP 上,也发生在 TCP 上。 与 TCP 发生丢包时的区别,它会通知发送方该数据包丢失并应重新发送。

这就是为什么 UDP 更快,但不太准确的原因。

如果您真的希望所有消息都通过,请使用 TCP。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM