BeginRead 是不是保证读取在调用它之后到达的任何传入字节?

Posted

技术标签:

【中文标题】BeginRead 是不是保证读取在调用它之后到达的任何传入字节?【英文标题】:Is BeginRead guaranteed to read any incoming bytes that arrive after a call to it?BeginRead 是否保证读取在调用它之后到达的任何传入字节? 【发布时间】:2011-09-23 19:51:39 【问题描述】:

假设在调用 BeginRead 之后,还有其他代码最终会触发我要读取的字节的到达。是否有可能出现以下情况:

(1) 调用 BeginRead,传入 'buf' 并返回

(2) 保证在 (1) 之后执行的其他代码并导致字节被发送到端口

(3) 字节到达端口,但由于一些时间问题没有读入'buf'

我不认为这是可能的,但我正在寻找有经验的人的确认。如果这是可能的,那么获得我正在寻找的保证的替代方法是什么?

【问题讨论】:

【参考方案1】:

BeginRead 将在 一些 数据可用时完成 - 但不能保证 有多少 数据。最明显的例子是,如果在您的“额外”数据发送到端口之前缓冲区已经被填充......但同样,缓冲区没有必须被填充 - 例如,在网络流,BeginRead 可能会在读取单个数据包时返回,即使还有更多数据包在路上。

您可能想要反复调用BeginRead,直到您读取了流中的所有数据(即另一端已关闭连接)或者您已阅读尽可能多的内容(例如,整个以长度为前缀的消息)。

【讨论】:

【参考方案2】:

如果您想进行适当的网络通信,您必须进行应用程序级框架。

说真的,最简单的方法是使用一个消息库来为您处理所有这些。看看zeromq,它真的很棒,而且有一个 .NET 绑定。

【讨论】:

【参考方案3】:

字节可能在那里,但它们可能不在您要查找的位置。不看代码很难说。我建议使用 WireShark 进行观察,以确保您认为发送的数据是真实的。

【讨论】:

以上是关于BeginRead 是不是保证读取在调用它之后到达的任何传入字节?的主要内容,如果未能解决你的问题,请参考以下文章

信号是不是保证到达线程?

TCP是不是保证按顺序到达?

在所有情况下都必须调用 EndRead() 吗?

扭曲的 RPC 是不是保证按顺序到达?

异步编程模型

调整缓冲区长度以从 NetworkStream 读取小数据