当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的有效缓冲区终止符吗?连接似乎只是因为客户端"关闭"而关闭的。这是正确的吗?
这就是流,尤其是TCP套接字的工作方式。您可以继续读取它们,直到读取操作完成,但返回的字节计数为0。0是向代码发出的信号,表示没有更多的数据要读取。
在TCP套接字流(例如从TcpClient.GetStream()
返回的流)的情况下,协议知道当远程端使用"send"或"both"作为参数执行关闭操作时,将没有更多的数据可供读取。这就是远端实际发送数据完成的信号的方式。
在本地端,这被解释为流的结束。正如我上面所说,通过完成读取操作(读取的字节数为0),这反过来会报告给您的代码。