rainfish 发表于 2008-12-17 11:13:16

关于Proactor的异步问题。

由于Proactor是异步IO,所以收到的数据包可能是乱序的,比如连续发包1,2,3,4,5.收到的可能是1,2,4,3,5,这个我已经测试过,确实是这样子的。当发送的时候,如果Sleep(100)的话,收到的就是顺序的。可是在大量IO操作时如果Sleep,势必造成性能下降,那么怎么保证包的顺序收到呢?
需求是这样子的,比如我发个比较大的包,100K,但是客户可能要求每次最多只能发包10K,这样必须拆包,可是如果收到的乱序的,就很麻烦。而且可能在两个大包间乱序,比如大包1的最后一个小包要比大包2的第一个小包来的晚,怎么处理?
这个问题困扰我很久了。希望达人帮忙解决一下。感激不尽!

winston 发表于 2008-12-17 12:42:07

我用Proactor很久很久了,怎么从来没听说、发现过他还乱序?Proactor自己已经做了序列化的处理,参见ACE文档。如果是自己写IOCP,就得注意这个乱序的问题了。
你贴上代码来看看吧。我也觉得很奇怪。

rainfish 发表于 2008-12-17 13:54:22

回复 #2 winston 的帖子

winston 老大说的不错,我又仔细看了一下代码,发现确实是乱序,但原因是1,2,3,4,5五个包是五个客户端发送的,而不是一个客户端,虽然5个客户端是按顺序发送的,即1客户端发送第一个包,然后第二个客户端发送第二个包。。。,这样子收到的却是是乱序,可能第三个客户端发送的数据包在第四个以后才来到,当然这严格来说也不叫乱序。
如果是一个客户端发送数据包,确实不乱序,也测试过了:)

winston 发表于 2008-12-17 15:46:56

这就是了。不同客户端做一下区分就好了。

newzai 发表于 2008-12-17 20:19:25

如果是TCP,那么由于TCP的流的特性决定了 按 1 2 3 4 5 发送到对方的时候不会编程13254或者其它的顺序。只要在发送方那里能够确保发送1后在发送2,在发送3既可以了,如果你出现乱序很可能是12345的发送是属于在不同的线程一起发送而其又没有加锁导致的。

如果是UDP,出现上除的乱序情况是正常的,而其符合UDP的协议规范。

winston 发表于 2008-12-18 00:10:11

赞同。
页: [1]
查看完整版本: 关于Proactor的异步问题。