.NET的NetworkStream关闭,如何确保所有数据被读取?(.NET NetworkStre

2019-09-28 05:23发布

我有一个开放的TCP连接,并读取使用NetworkStream.BeginRead()。 一旦连接在任一端封闭,回调被调用,所述流对象是无用 - 像文档说,EndRead()抛出IOException异常或视的ObjectDisposedException在这种情况下在其上端终止连接。

它是保证没有任何数据我错过仅在过去成功EndRead(和重新BegingRead)和断开之间,特别是如果我这样做,在我结束了吗? 如果不是,万一我结束时关闭连接,我必须手动NetworkStream.Read()断开,以确保没有当被读出?

Answer 1:

在这种情况下要使用的模式是使用的BeginRead来读取数据流(就像你正在做的),并处理“更多的数据流中的”回调方法的情况下。
回调方法调用EndRead和(典型地通过将其追加到StringBuilder实例)收集从该流读取数据,然后再次调用的BeginRead。 只要EndRead返回0字节,那是你的保证,有没有更多的数据从流中读取。

这里的文档可能对您有用: 使用异步客户端套接字

我注意到,无处有没有它特别指出的0字节回报率的保证,所以我在这里明白你的困惑,但例子是很清楚,那是你的信号退出阅读。



文章来源: .NET NetworkStream closed, how to be sure all data is read?