Socket编程:异步的发送和读取方法能保证数据的顺序吗?

Posted

技术标签:

【中文标题】Socket编程:异步的发送和读取方法能保证数据的顺序吗?【英文标题】:Socket programming : Can asynchronous methods of send and read ensure the order of data? 【发布时间】:2011-10-21 10:01:08 【问题描述】:

如果我如下图连续调用c#异步方法:

socket.BeginSend(data1, 0, data1.Length, 0,
        new AsyncCallback(SendCallback1), handler);
socket.BeginSend(data2, 0, data2.Length, 0,
        new AsyncCallback(SendCallback2), handler);

异步方法能保证数据的顺序吗?

其他支持异步操作的网络库是否考虑了问题? 它们是如何实现的,以保证内部异步操作中的数据顺序?

【问题讨论】:

【参考方案1】:

不,我认为异步方法不能保证您发送的数据将按顺序发送或调用或发送。

正如 Marc 所说,即使它确实有效,但请注意这不是正确的方法,您不应该并排或一个接一个地调用两个 BeginSend。您可以做的是在第一个 BeginSend 的回调方法中调用 EndSend,然后在该回调中调用下一个 BeginSend。

This 是一篇关于该主题的不错的 MSDN 文章,请在继续阅读之前先阅读它

【讨论】:

【参考方案2】:

通常,在调用 EndSend 之后,您只会在第一个回调中执行第二个 BeginSend。如果已经有一个不完整的 BeginSend 正在进行,我实际上希望图书馆会抛出一个异常。但如果它抛出 - 我怀疑是否能保证秩序(我怀疑也能保证成功)。

您还可以考虑异步 CTP,它具有此类事情的延续,允许您“等待”发送,然后将其他工作作为延续来执行。

【讨论】:

以上是关于Socket编程:异步的发送和读取方法能保证数据的顺序吗?的主要内容,如果未能解决你的问题,请参考以下文章

linux系统socket通信编程详解函数

同步和异步 各是啥啊。能举例说明吗?

Java 网络编程之 Socket

使用异步套接字编程发送二进制数据并读取其值

Java Socket编程之TCP

python socket编程