//recv_d是一个168000字节的大数据
                int len=sizeof(recv_d);
while(len>0)
{
ret=recv(recvs,(char*)recv_d+ret,len,0);
if (ret==SOCKET_ERROR)
{
closesocket(recvs); //关闭套接字句柄
cout<<"与服务器连接错误"<<endl;
return 0;
}
                        len=len-ret;
                    //查看一下每次实际recv的字节数
                        char aaa[5];
                        itoa(ret,aaa,10);
AfxMessageBox(aaa);

}症结所在:程序运行时,有时候循环一次收到168000字节的数据,数据没有问题:有时循环两次,分别收到20000,148000的数据,也没问题;但是有时循环3次,4次或者更多,每次收到不等的数据(加起来总共168000),这时候的数据就有问题了,刚学网络编程,望前辈们不吝赐教,(*^__^*) 嘻嘻……TCP/IPsocket大数据recv函数

解决方案 »

  1.   

    //查看一下每次实际recv的字节数
                            char aaa[5];
                            itoa(ret,aaa,10);你这个10
    不对把!
      

  2.   

    收的次数多了 AfxMessageBox弹框没及时关闭导致后续包到达之后未及时接受而丢弃
      

  3.   

    recv_d+ret   这里错了。   求分啊
      

  4.   

     int len=sizeof(recv_d);
     int nRecved = 0;
     while(len>0)
     {
     ret=recv(recvs,(char*)recv_d+nRecved,len - nRecved,0);
     if (ret==SOCKET_ERROR)
     {
     return;
    }
    nRecved += ret; }
      

  5.   


    tcp不用怕掉数据,下层有个接收缓冲区,大小可以自己设, 这个没满没问题,如果满了, 就开始堆服务器的发送缓冲区,这个在满了,服务器就send返回错误, WSAGetLastError() 缓冲区已满。
      

  6.   


    每次少收点问题就解决了,不过,还是不怎么清楚;服务器那端,send的返回值168000,send把数据copy到发送缓冲区不就返回了,而接收发送缓冲区只有4k,那“多余”的那些数据呢?阻塞在哪里了么?还是我理解有问题
      

  7.   

    “recv_d+ret   这里错了。   求分啊 ” ret前面给0了,没复制过来,加个AfxMessageBox框,只是为了看看返回值,直观点,不是问题所在,存在数组里也是一样。send貌似不会出问题,recv数据一大,就得多copy几次了,我看了下出问题时的数据,每次出问题的地方都不一样,感觉是数据太大,recv从接收缓冲区copy数据就会出问题,而不是我程序哪里出错了
      

  8.   


    char * buf  = new char[65535];
    memset(buf , 0 , 65535);int mCopyLen = 0;
    whie(1)
    {
                 int retLen = recv(recvs , buf , 65535 , 0);
                if(retLen > 0) 
            {
            
    memcpy(recv_d +mCopyLen, buf , retLen);
    mCopyLen += retLen;
         }else if (retLen < 0)
        {
                  break; 
    }
               
         
               
    }
      

  9.   

    “出问题”我指的是接收到的数据有问题,中间一部分夹杂着乱码。按代码来recv是去接收缓冲区copy了总共168000字节的数据,但是其中一部分并不是我要的数据。
      

  10.   

    ret=recv(recvs,(char*)recv_d+ret,len,0);改为
    ret=recv(recvs,(char*)recv_d+(sizeof(recv_d) - len),len,0);
      

  11.   

    简单点的办法是你把recv的接收数据的buffer开大点,超过你发送数据的大小,复杂点的办法是
    你把每次接收到的实际数据大小累加等于你发送的数据大小时退出循环就可以了!
    tcp基本不存在丢包的问题,除非你接收线程阻塞时间太久,但是tcp粘包问题需要考虑,
    看你的例子估计你这不需要考虑粘包的问题