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

解决方案 »

  1.   

    如果你使用的是IOCP 他内部 存在一个对列这个对列 维护一个 先后次序如果你在单线程中Send(1) Send(2)那么对方肯定就会按照顺序收到1和2,这个是没有必要考虑的但是实际上程序经常要使用多线程用户想要Send(1) 再 Send (2)可能由于线程的切换导致 发送顺序 改变解决办法1:+序列号
    解决办法2:Send时候互斥(这种方法降低了Send并发,但是在小型的服务器上,已经够用了)
      

  2.   

    还有就是我想在TCP中发送大的文件,WSASend ,Send 和 WSARecv ,recv 函数到底可以接收和发送多少字节的啊