1

我有一个开放的 TCP 连接,并使用 NetworkStream.BeginRead() 进行读取。一旦在任一端关闭连接,就会调用回调并且流对象是无用的 - 就像文档说的那样,EndRead() 抛出 IOException 或 ObjectDisposedException 取决于在这种情况下终止连接的一端。

是否保证在最后一次成功的 EndRead(和 re-BegingRead)和断开连接之间没有任何数据丢失,特别是如果我在最后这样做?如果不是,如果我结束连接,我是否必须在断开连接时手动 NetworkStream.Read() 以确保没有任何未读的内容?

4

1 回答 1

2

在这种情况下使用的模式是使用 BeginRead 来读取流(就像您正在做的那样)并在回调方法中处理“流中的更多数据”情况。
回调方法调用 EndRead 并收集从流中读取的数据(通常通过将其附加到 StringBuilder 实例),然后再次调用 BeginRead。一旦 EndRead 返回 0 字节,这就是您保证不再从流中读取数据的保证。

以下是您可能会发现有用的文档:使用异步客户端套接字

我注意到那里没有具体说明 0 字节返回是保证,所以我理解你在这里的困惑,但这个例子很清楚,这是你退出阅读的信号。

于 2010-06-24T15:22:03.950 回答