我应该使用while(true)从Socket接收数据吗

本文关键字:Socket 数据 while true 我应该 | 更新日期: 2023-09-27 18:28:50

请参阅我之前的代码示例套接字问题:有时(很少)数据包在接收时丢失

我需要始终从UDP多播套接字接收数据。这是单向混合,我只需要倾听新的数据并尽快处理它。

我应该使用while(true)吗?我不喜欢while(true),因为在我看来这会给处理器带来很多额外的工作。可能c#提供了其他回调技术或其他什么?

我应该使用while(true)从Socket接收数据吗

2到6个套接字(注释)可能是一个有趣的地方,阻塞或异步IO都可以很好地工作,因为你不会用线程淹没机器。每秒2000个数据包,听起来有很多东西可以让线程保持忙碌。从性能的角度来看,您不需要担心while(true),因为Receive方法将阻塞,直到数据可用,所以它是never不做任何事情的热循环。然而就我个人而言,从外观的角度来看,我同意while(true)是一个不必要的印迹,所以如果你使用的是阻断方法,也许可以考虑:

int bytesRead;
while((bytesRead = socket.Receive(buffer)) > 0) {
    // process bytesRead from buffer
}

当插座闭合时,其将干净地退出。

还可以使用BeginReceiveSocket.ReceiveAsync方法执行此操作,这两种方法不使用阻塞调用,而是使用事件或回调。这些在处理大量连接时特别有用。

就我个人而言,我倾向于使用Socket.Available;如果这是肯定的,那么就有缓冲的数据可以使用,因此可以使用简单的Receive来快速获取数据,而无需上下文切换。如果为零,则当前没有数据可用,因此异步调用可能更合适。这平衡了上下文切换和直接调用。请注意,ReceiveAsync方法也通过ReceiveAsync的返回值内置了这一点(如果操作未完成,则为true,稍后将调用回调;如果操作已经完成,则false,并且不会调用回调)。

套接字编程的最佳方式是使用它们的异步对应程序。与其运行无休止的循环,不如调用BeginReceive并设置它的回调方法,该方法将在传输完成时触发。这样,你就可以保持对应用程序的控制,并使用更少的资源。

参考:http://msdn.microsoft.com/en-us/library/bbx2eya8.aspx#Y0

异步方法是最好的解决方案。

然而,在这种情况下,如果使用while(true),则包含套接字。接收(buf)处理器没有额外的工作,因为如果你不设置超时,socect会阻塞循环,直到数据到达。