客户端发送的数据(几十k)
服务器总是接受到8k左右。请问怎么才能够介绍完所有数据呢?
服务器接受流程大概为:
1.投递0字节的WSARecv
2.完成通知,利用recv接受数据
3.再次投递0字节的WSARecv但是recv接受数据的数据都不会超过8k,为什么呢?

解决方案 »

  1.   

    socket的接收缓冲区默认是8KB,剩下的数据下次再收。
      

  2.   

    第3次不应该投递0的WSARecv,应该计算还有多少没收,就WSARecv多少...
      

  3.   

    不好意思,我看错了,你是总投递长度为0的WSARecv...
    那就是用计算后的长度做第四次的recv
      

  4.   

    我怀疑是不是底层把剩余的数据丢弃了。
    因为我测试了只要少于8k,接受数据都是正确的。例如发送3k的数据用下面方式接受
    1.投递0字节的WSARecv 
    2.完成通知,利用recv只接受1k数据 
    3.再次投递0字节的WSARecv 
    下次依然可以有完成通知,可以继续把剩余的2k接受完毕。但是如果数据量超过8k的话
    接受了一次(小于发送数据)就不会有完成通知了
      

  5.   

    为什么在得到通知的时候用recv呢,直接从投递通知的wsarecv返回你要的数据不行???
      

  6.   

    如果你觉得8k这个数有什么特殊含义,可以setsockopt SO_RCVBUF更改缓冲区大小
    看看是不是与缓冲区相关
    或者直接缓冲设为0得了......
      

  7.   

    通知返回之后有再次WSARecv么?如果没有,当然不会再通知,通知与请求之间是一对一的匹配关系。
      

  8.   


    因为一次接受完毕的数据量远远小于发送的数据量,所以再次WSARecv的话应该还会有通知才对的啊?
      

  9.   


    post intial recv: 
        WSARecv(lenhdr)recv_loop:
        GetOverlappedResult() or GetQueuedCompletionStatus()
        
        validate_msg_header(ptrhdr) & get lenbdy 
        
        WSARecv(lenbdy)
        insert_msg_into_queue(ptrbdy)
        
        WSARecv(lenhdr)
        
      

  10.   

    int nOptionValue,nOptionSize=sizeof(int);
    //下面返回的nRcvBuffer是8192
    getsockopt(m_hSocket,SOL_SOCKET,SO_RCVBUF,(char*)&nOptionValue,&nOptionSize);
    INT nRcvBuffer=32*1024;int nRetCode=setsockopt(m_hSocket,SOL_SOCKET,SO_RCVBUF,(const char*)&nRcvBuffer,sizeof(nRcvBuffer));nOptionSize=sizeof(int);
    //下面返回的nRcvBuffer是32768
    getsockopt(m_hSocket,SOL_SOCKET,SO_RCVBUF,(char*)&nOptionValue,&nOptionSize);说明设置成功了。但是recv接受到的数据仍然是8336