我要调用recv函数接收一个不定长的数据包,一次调用recv可能会收到几个数据包,也可能要调几次才能收完一个数据包,整个数据包长度由前两个字节指示。我想先把这两个字节取出来,然后根据它的值分配buffer,再去取消息体,请问如何实现?我又如何才能知道一次recv的从网络上接收了多少个字节的数据呢?请各位达人不吝赐教。

解决方案 »

  1.   

    recv的返回值就是接收到的字节数
      

  2.   

    int ret,pklen, FileLength;
        unsigned char *m_buf=NULL;
        SOCKET sclient;
        struct sockaddr_in server;
        while(1)                //这个循环用于连接服务器
        {
            if(connect(sclient,(struct sockaddr *)&server,sizeof(server))<0)
            {
                AfxMessageBox("连接失败,请检查网络!");        
                //continue;
                break;
            }
            while(1)            //这个循环用于接收服务器发送的数据
            {            char Length[2];
                ret=recv(sclient,(char *)Length,2,0);   //接收数据长度
                if(ret)
                {
                    ret=Length[0];
                    ret=ret<<8|Length[1];   //拼接长度
                    m_buf=(BYTE *)new char[ret];
                }
                else
                    AfxMessageBox("数据接收失败,请检查网络或重启程序!");
                while(1)//这个循环用于接收服务器发送的图像,存盘
                {
                    pklen=0;
                    FileLength=0;
                    pklen=recv(sclient,(char *)m_buf,ret,0);
                    if(pklen<=0)
                    {
                        AfxMessageBox("数据接收失败,请检查网络或重启程序!");
                        break;
                        //continue;
                    }
                    FileLength+=pklen;
                    if(FileLength==ret) break;
                }
            }
            break;
        }
      

  3.   

    qdhuxp(阿牛) 和 chenyulin(chen)   正解理想情况下可以这么做