Socket.EndRead 0字节意味着断开连接?

时间:2009-09-08 16:46:39

标签: c# sockets asynchronous

我想知道在c#中的异步套接字中,在EndRead调用中接收0个字节意味着服务器实际上已经断开了我们的连接吗?

我看到的很多例子都表明情况就是如此,但我收到的断线频率要高得多。

这段代码是否正确?或者endResult< = 0对连接状态没有任何意义吗?

private void socket_EndRead(IAsyncResult asyncResult)
{ 
  //Get the socket from the result state
  Socket socket = asyncResult.AsyncState as Socket;

  //End the read
  int endResult = Socket.EndRead(asyncResult);

  if (endResult > 0)
  {
    //Do something with the data here


  }
  else
  {
    //Server closed connection?  
  }
}

2 个答案:

答案 0 :(得分:6)

From the docs

  

如果远程主机关闭了Socket连接并且收到了所有可用数据,则EndRead方法立即完成并返回零字节。

所以是的,零字节表示远程关闭。

答案 1 :(得分:2)

0读取长度应该意味着gracefull关闭。断开投掷error(10054,10053或10051)。

在实践中虽然我确实注意到读取完成时长度为0,即使连接处于活动状态,唯一的处理方法是检查0长度读取的套接字状态。情况如下:在套接字上发布多个缓冲区以进行接收。然后发布的线程被池修剪。操作系统注意到发出请求的线程已经消失,它会通过错误995 ERROR_OPERATION_ABORTED通知发布的操作,如文档所述。然而,我发现当发布多个操作(即多次读取)时,只有第一个被通知错误995,后续通知成功且长度为0。