首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于投递多个IO的有关问题 着急

2012-01-31 
关于投递多个IO的问题 着急啊。。。。重叠IO和完成端口模式允许对同一个SOCKET一次性投递多个IO,如果程序是多

关于投递多个IO的问题 着急啊。。。。
重叠IO和完成端口模式允许对同一个SOCKET一次性投递多个IO,如果程序是多线程的,那么如何保证收到数据的次序呢?特别是TCP协议下,
比如接收方:
WSARecv(s...buffer1..);
....
WSARecv(s...buffer2..);   ...投递了多个IO
而发送方可能发送的是一个很大的数据块,于是他把这个数据块分成小块,然后用WSASend(s...data1..);
WSASend(s...data2..);
...
WSASend(s...datan..);进行发送,但是因为是多线程的,对方主机实际发送的次序是否一定按照data1,data2..的顺序发送呢?那么因为我这边也是多线程的,到底要如何保证接收到的次序呢?是必须制定自己的协议吗?

[解决办法]
如果你使用的是IOCP 他内部 存在一个对列

这个对列 维护一个 先后次序

如果你在单线程中Send(1) Send(2)

那么对方肯定就会按照顺序收到1和2,这个是没有必要考虑的

但是实际上程序经常要使用多线程

用户想要Send(1) 再 Send (2)

可能由于线程的切换导致 发送顺序 改变

解决办法1:+序列号
解决办法2:Send时候互斥(这种方法降低了Send并发,但是在小型的服务器上,已经够用了)

热点排行