BeginRead是否保证读取调用后到达的任何传入字节?

时间:2011-09-23 19:51:39

标签: .net asynchronous asyncsocket

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

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

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

(3)字节到达目的地为端口但由于某些时间问题而未被读入'buf'

我不希望这是可能的,但我正在寻找有经验的人的确认。如果这在某种程度上是可能的,那么什么是获得我正在寻找的保证的替代方案?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

如果您想进行正确的网络通信,必须进行应用程序级别的构建。

但实际上,最简单的方法是使用一个消息库来处理所有这些问题。看看zeromq,它真的很棒,并且有一个.NET绑定。

答案 2 :(得分:0)

字节可能在那里,但它们可能不在您寻找它们的位置。没有看到代码就很难说。我建议使用WireShark观察以确保您认为正在发送的数据确实存在。