假设在调用 BeginRead 之后,还有其他代码最终会触发我要读取的字节的到达。以下情况是否可能:
(1) 调用 BeginRead,传入 'buf' 并返回
(2) 保证在 (1) 之后执行的其他代码并导致字节被发送到端口
(3) 字节到达指定端口,但由于某些时间问题没有读入“buf”
我不认为这是可能的,但我正在寻找有经验的人的确认。如果这在某种程度上是可能的,那么获得我正在寻找的保证的替代方法是什么?
假设在调用 BeginRead 之后,还有其他代码最终会触发我要读取的字节的到达。以下情况是否可能:
(1) 调用 BeginRead,传入 'buf' 并返回
(2) 保证在 (1) 之后执行的其他代码并导致字节被发送到端口
(3) 字节到达指定端口,但由于某些时间问题没有读入“buf”
我不认为这是可能的,但我正在寻找有经验的人的确认。如果这在某种程度上是可能的,那么获得我正在寻找的保证的替代方法是什么?
BeginRead
将在一些数据可用时完成 - 但不能保证有多少数据。最明显的例子是,如果在您的“额外”数据发送到端口之前缓冲区已经被填充......但同样缓冲区不必填充- 例如,在网络流中,BeginRead
可能会在单个数据包已被读取,即使在路上还有更多数据包。
您可能想要BeginRead
反复调用,直到您读取了流中的所有数据(即另一端已关闭连接)或您已读取尽可能多的内容(例如整个长度前缀消息)。
字节可能在那里,但它们可能不在您寻找它们的位置。不看代码很难说。我建议使用 WireShark 进行观察,以确保您认为正在发送的数据是真实的。
如果您想进行适当的网络通信,则必须进行应用程序级框架。
但实际上,最简单的做法是使用一个为您处理所有这些的消息传递库。看看zeromq,它真的很棒,并且有一个 .NET 绑定。