当Socket.EndRead()返回0时

本文关键字:返回 0时 Socket EndRead | 更新日期: 2023-09-27 18:30:01

在MSDN异步客户端的示例中,EndRead的调用方式如下:

private static void ReceiveCallback( IAsyncResult ar ) {
        try {
            // Retrieve the state object and the client socket 
            // from the asynchronous state object.
            StateObject state = (StateObject) ar.AsyncState;
            Socket client = state.workSocket;
            // Read data from the remote device.
            int bytesRead = client.EndReceive(ar);
            if (bytesRead > 0) {
                // There might be more data, so store the data received so far.
            state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,bytesRead));
                // Get the rest of the data.
                client.BeginReceive(state.buffer,0,StateObject.BufferSize,0,
                    new AsyncCallback(ReceiveCallback), state);
            } else {
                // All the data has arrived; put it in response.
                if (state.sb.Length > 1) {
                    response = state.sb.ToString();
                }
                // Signal that all bytes have been received.
                receiveDone.Set();
            }
        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }
}

但是bytesRead怎么可能是零呢?根据文档,EndReceive被阻止,直到连接关闭。<EOF>是Socket.BeginReceive的有效缓冲区终止符吗?连接似乎只是因为客户端"关闭"而关闭的。这是正确的吗?

当Socket.EndRead()返回0时

这就是流,尤其是TCP套接字的工作方式。您可以继续读取它们,直到读取操作完成,但返回的字节计数为0。0是向代码发出的信号,表示没有更多的数据要读取。

在TCP套接字流(例如从TcpClient.GetStream()返回的流)的情况下,协议知道当远程端使用"send"或"both"作为参数执行关闭操作时,将没有更多的数据可供读取。这就是远端实际发送数据完成的信号的方式。

在本地端,这被解释为流的结束。正如我上面所说,通过完成读取操作(读取的字节数为0),这反过来会报告给您的代码。