【发布时间】:2016-02-27 01:32:16
【问题描述】:
NetworkStream.Read method documentation 声明它在两种情况下返回零:
- "如果没有数据可供读取,Read 方法返回 0。"
- “如果远程主机关闭连接,并且已接收到所有可用数据,则读取方法立即完成并返回零字节。”
还有以下观察:
通过调用 CanRead 属性检查 NetworkStream 是否可读。如果您尝试从不可读的 NetworkStream 中读取,您将收到 IOException。
我对此感到非常困惑。我怎么知道我可以继续阅读还是应该停止阅读?
采取以下示例方法:
void Receive(byte[] buffer)
{
int idx = 0;
while (idx < buffer.Length)
{
if (input.CanRead)
{
int read = input.Read(buffer, idx, buffer.Length - idx);
if (read == 0)
{
// ???
}
idx += read;
}
else
{
throw new MyLibConnectionClosedException("Cannot receive because the connection was closed");
}
}
}
它应该填满整个缓冲区,否则应该抛出异常(如果连接关闭或丢失)。这样做的正确方法是什么?
【问题讨论】:
-
在我看来,MS 不太可能偏离他们的标准做法,即仅在到达流末尾的情况下返回“读取的零字节”。你能具体指出“现在没有什么可读的”时返回零的文件吗?根据我对
System.IO.Stream的所有经验,我认为这是不正确的(如果不是,我有很多修复工作要做)。 -
所以
NetworkStream派生自抽象Stream类。这里的文档很清楚:返回:“读入缓冲区的总字节数。如果当前没有那么多字节可用,这可能小于请求的字节数,如果流的末尾有达到了。”我认为任何关于 0 表示“流结束”以外的任何内容的建议都是错误的文档。 -
链接文档显示“如果没有数据可供读取,Read 方法返回 0”(请参阅帖子中的链接,我正在更新我的问题)
标签: c# .net network-programming