在一个连接中调用两次WSASend,一次发送了40960字节的0到客户端,一次是1,服务器每次GetQue返回的都是完整发送,所以客户端也没有乱序接收,没有模拟出ERROR_IO_PENDING情况。现在对tcp的乱序很迷惑ing。
我的想法;如果第一次投递到套接字s上的数据大于了数据缓冲区,那么操作系统锁定该区域,发送,这时候如果用户再投递一次WSASend,如果这次投递数据正好可以copy到缓冲区,则,系统会按照顺序发送还是?这时候两次数据的发送顺序是???
期待高人

解决方案 »

  1.   

    Some body at here??
      

  2.   

    发送到缓冲区是一回事,从缓冲区再发送到网卡是另一回事。
    TCP是保证顺序的。
      

  3.   

    楼上的意思是,对于服务器来说他发送出去的肯定是第一个大的包,第二个,第三个这样,如果客户端阻塞接收,那么接收到的肯定是第一个、第二个、、、
    有没有可能客户端接收的会是第一个包的一部分,第二个包的一部分??
    tcp是会保证一个报文的完整性,但发送的顺序也会保证吗??
      

  4.   

    只要send调用成功,绝对是顺序的recv到,但分多少次,每次收到多少数量,可就没准了。搜索一下“粘包”,网上大把遇到这方面问题的介绍文章。
      

  5.   

    你需要在发送出现错误时自行处理后续数据的发送顺序.
    TCP协议只保证在系统缓冲中数据的顺序收发.
    它是不会越位的.
      

  6.   

    楼上的说到点上了。
    是不是这样的:
    //这里发送0000000
    int nRet = WSASend(...);
    if(nRet == SOCK_ERROR)
    {
       DWORD dwError = WSAGetLastError();
       if(dwError == WSA_IO_PANDING)
       {
           //进入这里了。
       }
    }
    //这里发送111111
    nRet = WSASend(...);
    if(nRet == SOCK_ERROR)
    {
       DWORD dwError = WSAGetLastError();
       if(dwError == WSA_IO_PANDING)
       {
         // 这里也进入了。
       }
    }
    ////////////
    BOOL bTrue = GetQueuedCompletionStatus(...);
    这个时候,首先返回的有没有可能是 11111那个IO发送操作????????
    这个时候按照贯列,如果返回发送出去的数据小于要发送的数据,则
    wsaBuffer.buf = szBuffer+hasRecv;
    wsaBuffer.len= buflen-hasRecv;
    然后再WSASend数据,按照这样的程序处理方式,是不是就会出现
    000001111100000呢??