我如何知道异步套接字读取何时结束
本文关键字:读取 何时 结束 套接字 异步 何知道 | 更新日期: 2023-09-27 18:25:15
我有一个异步读取方法。。。
private void read(IAsyncResult ar) {
//Get the Server State Object
ServerState state = (ServerState)ar.AsyncState;
//read from the socket
int readCount = state.socket.EndReceive(ar);
//check if reading is done, move on if so, trigger another read if not
if (readCount > 0) {
//purge the buffer and start another read
state.purgeBuffer();
state.socket.BeginReceive(state.buffer, 0, ServerState.bufferSize, 0, new AsyncCallback(read), state);
}
else {
//all bytes have been read, dispatch the message
dispatch(state);
}
}
我遇到的问题是,如果连接关闭,read仅为0。我该怎么说呢,这是该消息的结尾,并将数据传递给调度器,同时保持套接字打开以接受新消息。
谢谢!
您不应该依赖TCP缓冲区中的内容。您必须在某个地方将传入的字节作为流进行处理。你真的不知道它是否完整。只有上面的一层可以知道消息何时完成。
示例:如果您读取HTTP响应,HTTP标头将包含HTTP正文中的字节计数。所以你知道该读多少书。
只有当数据遵循特定的协议并进行解释时,你才知道要读取多少。想象一下,你通过套接字接收到一个文件。你会收到的第一件事是文件大小。如果没有这些,你就永远不知道该读多少书。
您应该使消息符合特定的格式,以便区分它们何时开始和何时结束。即使它是一个数据流,也应该以数据包的形式发送。
一种选择是先发送消息的长度,然后知道需要多少数据。但问题是,如果你失去了同步,你就永远无法恢复,也永远不知道消息的长度和内容。最好使用一些特殊的标记序列来知道消息何时开始。它不是100%防错的(序列可能出现在数据中),但肯定有帮助,并允许从同步松散中恢复。当从类似套接字的二进制流中读取时,这一点尤为重要。
即使是古老的RS232串行协议也有其帧和停止位,可以知道何时获得所有数据。