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 是不是保证读取在调用它之后到达的任何传入字节?的主要内容,如果未能解决你的问题,请参考以下文章