许多“UdpClient ReceiveAsync”会永远等待吗?

时间:2014-06-30 14:28:04

标签: c# asynchronous udpclient

我有这段代码通过UdpClient发送命令,然后等待回复:

cameraListener = new UdpClient(52381);      
cameraSender = new UdpClient();
cameraSender.Connect(endPoint);  

int dataSent = await cameraSender.SendAsync(command, command.Length);
UdpReceiveResult result = await cameraListener.ReceiveAsync();

注意:" endPoint"只是一个普通的IPAddress:端口端点。

如果Camera离线,会发生什么?

由于它是UDP,SendAsync将正确发送数据,但ReceiveAsync将永远等待响应。如果这两行代码(SendAsyncReceiveAsync)定期执行,那么无限ReceiveAsync会一直等待响应直到系统崩溃吗?

或者他们会在某个时间终止或被操作系统终止吗?是否必须手动实现定时器" kill" UDP套接字终止永恒的等待?

1 个答案:

答案 0 :(得分:4)

UDP消息可能会丢失。这意味着如果对方没有重试其消息,您的接收确实可以永远等待。你需要暂停。

更糟糕的是,如果您多次运行此代码(意图多次发送),您可以收到一条用于其他发送的消息,因为在同一个套接字上进行并发读取时,未定义读取的内容是什么

如果你只是在没有超时的情况下排队越来越多的读数,你迟早会耗尽一些资源。别这么做。

可能你应该有一个接收循环,只接收它获得的所有内容并进行处理。

发送可以独立于此。

更好的是,使用像TCP这样的可靠传输。