Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Socket.EndRead 0字节表示已断开连接?_C#_Sockets_Asynchronous - Fatal编程技术网

C# Socket.EndRead 0字节表示已断开连接?

C# Socket.EndRead 0字节表示已断开连接?,c#,sockets,asynchronous,C#,Sockets,Asynchronous,我想知道,在我的c#异步套接字中,在EndRead调用中接收到0字节是否意味着服务器实际上已经断开了我们的连接 我看到的许多例子都表明这是事实,但我收到断开连接的频率比我预期的要高很多 这个代码正确吗?或者endResult: 如果远程主机关闭套接字连接并且已接收到所有可用数据,EndRead方法将立即完成并返回零字节 因此,是的,零字节表示远程关闭。0读取长度应表示正常关闭。断开(10054、10053或10051) 在实践中,尽管我注意到即使连接处于活动状态,读取也会以0长度完成,唯一的处理

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

我看到的许多例子都表明这是事实,但我收到断开连接的频率比我预期的要高很多

这个代码正确吗?或者endResult:

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


因此,是的,零字节表示远程关闭。

0读取长度应表示正常关闭。断开(10054、10053或10051)


在实践中,尽管我注意到即使连接处于活动状态,读取也会以0长度完成,唯一的处理方法是检查0长度读取的套接字状态。情况如下:在套接字上发布多个缓冲区以进行接收。然后发布的线程将被池修剪。操作系统注意到发出请求的线程消失了,并通知发布的操作错误995
error\u OPERATION\u ABORTED
,如文档所示。然而,我发现,当发布多个操作(即多次读取)时,只有第一个操作收到错误995的通知,随后的操作收到成功和0长度的通知。

好吧,MSDN的说法并没有明确暗示如果接收到0字节,连接必须关闭,只是如果连接关闭,然后将接收0个字节。也许我对这句话的逻辑理解得太深了……这是一种阻碍性解读。这意味着它将永远等待,直到输入一个或多个字节。如果您看到零字节,唯一可能的情况是远程主机关闭了套接字。如果我启动一个读取哪个请求来读取0字节呢?如果我请求读取0字节,如何检查连接是否关闭?我想我不应该忘记告诉大家我实际上使用的是SslStream,但我一开始并不认为这很重要,因为我确信底层的流归根结底是套接字。但是,因为我使用的是SslStream,所以我没有权限检查套接字的连接状态。也许我应该在从EndRead收到0字节时检查SslStream.CanRead?我在问题中添加了一条注释。。。所以,当我得到一个0长度的EndRead时,使用SslStream.CanRead是否足够,你认为呢?如果你在网络流的顶部有一个加密流,你认为这是非常不同的。首先,您不能有我描述的情况,因为SslStream将不接受多个已发布的读取。第二,即使套接字返回成功且错误为0,Ssl流也已经看到了这一点并采取了行动(即,您的Ssl状态现在将允许您继续),因此您只有一个可能的操作,即处理流并再次连接。typos galore:thinks=>things,will allow=>will not allowSo,底线,如果我得到int lengthRead=sslStream.EndRead(state)返回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?  
  }
}