我想知道在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?
}
}
答案 0 :(得分:6)
答案 1 :(得分:2)
0读取长度应该意味着gracefull关闭。断开投掷error(10054,10053或10051)。
在实践中虽然我确实注意到读取完成时长度为0,即使连接处于活动状态,唯一的处理方法是检查0长度读取的套接字状态。情况如下:在套接字上发布多个缓冲区以进行接收。然后发布的线程被池修剪。操作系统注意到发出请求的线程已经消失,它会通过错误995 ERROR_OPERATION_ABORTED
通知发布的操作,如文档所述。然而,我发现当发布多个操作(即多次读取)时,只有第一个被通知错误995,后续通知成功且长度为0。