找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3994|回复: 5

关于Proactor的异步问题。

[复制链接]
发表于 2008-12-17 11:13:16 | 显示全部楼层 |阅读模式
由于Proactor是异步IO,所以收到的数据包可能是乱序的,比如连续发包1,2,3,4,5.收到的可能是1,2,4,3,5,这个我已经测试过,确实是这样子的。当发送的时候,如果Sleep(100)的话,收到的就是顺序的。可是在大量IO操作时如果Sleep,势必造成性能下降,那么怎么保证包的顺序收到呢?
需求是这样子的,比如我发个比较大的包,100K,但是客户可能要求每次最多只能发包10K,这样必须拆包,可是如果收到的乱序的,就很麻烦。而且可能在两个大包间乱序,比如大包1的最后一个小包要比大包2的第一个小包来的晚,怎么处理?
这个问题困扰我很久了。希望达人帮忙解决一下。感激不尽!
发表于 2008-12-17 12:42:07 | 显示全部楼层
我用Proactor很久很久了,怎么从来没听说、发现过他还乱序?Proactor自己已经做了序列化的处理,参见ACE文档。如果是自己写IOCP,就得注意这个乱序的问题了。
你贴上代码来看看吧。我也觉得很奇怪。
 楼主| 发表于 2008-12-17 13:54:22 | 显示全部楼层

回复 #2 winston 的帖子

winston 老大说的不错,我又仔细看了一下代码,发现确实是乱序,但原因是1,2,3,4,5五个包是五个客户端发送的,而不是一个客户端,虽然5个客户端是按顺序发送的,即1客户端发送第一个包,然后第二个客户端发送第二个包。。。,这样子收到的却是是乱序,可能第三个客户端发送的数据包在第四个以后才来到,当然这严格来说也不叫乱序。
如果是一个客户端发送数据包,确实不乱序,也测试过了:)
发表于 2008-12-17 15:46:56 | 显示全部楼层
这就是了。不同客户端做一下区分就好了。
发表于 2008-12-17 20:19:25 | 显示全部楼层
如果是TCP,那么由于TCP的流的特性决定了 按 1 2 3 4 5 发送到对方的时候不会编程13254或者其它的顺序。只要在发送方那里能够确保发送1后在发送2,在发送3既可以了,如果你出现乱序很可能是12345的发送是属于在不同的线程一起发送而其又没有加锁导致的。

如果是UDP,出现上除的乱序情况是正常的,而其符合UDP的协议规范。
发表于 2008-12-18 00:10:11 | 显示全部楼层
赞同。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 03:55 , Processed in 0.016226 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表