【发布时间】:2014-03-14 14:05:59
【问题描述】:
我正在从事一个涉及通过 TCP 和 Google 协议缓冲区进行客户端服务器通信的项目。在客户端,我基本上是使用 NetworkStream.Read() 通过字节数组缓冲区从服务器进行阻塞读取。
根据 MSDN 文档,
该方法将数据读入buffer参数,返回成功读取的字节数。如果没有数据可供读取,Read 方法返回 0。Read 操作读取可用数据,最多为 size 参数指定的字节数。如果远程主机关闭连接,并且已接收到所有可用数据,则 Read 方法立即完成并返回零字节。
异步读取(NetworkStream.BeginRead 和 EndRead)也是如此。我的问题是 Read()/EndRead() 什么时候返回?似乎它会在缓冲区中的所有字节都被填充后返回。但在我自己的测试中,情况并非如此。在一个操作中读取的字节变化很大。我认为这是有道理的,因为如果在发送消息时服务器端出现暂停,客户端不应该等到读取缓冲区被填满。 Read()/EndRead() 本身是否有一些超时机制?
我试图找出 Mono 如何在 NetworkStream 中实现 Read() 并跟踪直到调用了外部方法 Receive_internal()。
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
此外,这个问题与 C# 无关 - 这是一个 .NET 问题。
-
@JohnSaunders 感谢您的编辑。
-
如果 Read 正在等待一个完整的数据缓冲区,如果远程方期望您的响应但您正在等待一个永远不会到来的完整缓冲区,您很容易死锁。
-
@usr 是的,我理解那部分。但是当 Read() 返回时仍然假设缓冲区尚未满?
标签: c# sockets tcp mono networkstream