CSOCKET中send(setbuf,20000)返加正确值,receive(receivebuf,20000),竟然要分成几段接收,后面的会覆盖前面的,怎么办啊大哥,我要根据头几个字节来检验,那除了第一段后面的就没有可叛字节了

解决方案 »

  1.   

    是不是Socket的buffer设置得不够大,或者是采用了默认值阿,建议把socekt的Buffer设置的大一点试一下。
      

  2.   

    char receivebuf[Max_BUFFER_SIZE+1];
    char szReadBuf[READ_BUFFER_SIZE+1];
    int  num;
    ....
    ZeroMemory(receivebuf,Max_BUFFER_SIZE+1);
    char *pBuf=receivebuf;
    while(1)
    {
       ZeroMemory(szReadBuf,READ_BUFFER_SIZE+1);
       num=pSocket.Receive(szReadBuf,READ_BUFFER_SIZE);
       if(num==SOCKET_ERROR)
       {
          //出错了,加入你的处理 
          break;
        }
        else
        {
            if(num>0)
            {
                //这段代码的计算也许有错,如果错了,就把指针再加1来试试吧
                memcpy(pBuf,szReadBuf,num);
                pBuf+=num;
            }
            else if(num==0)
            {
                //接收完毕,加入你的处理
                break;
            }
            else
            {
                //出错了,加入你的处理
                break;
            }
        }
    }//while(1)
      

  3.   

    帮你测了一把楼上老兄的代码,没有问题:)
    UINT ListenThread(LPVOID lparam)
    {
    CSocket sk,skrecv;
    sk.Create(9000);
    sk.Listen ();
    char strRec[20001];
    char read[4000];
    static long al=0;
    while(sk.Accept (skrecv))
    {
    char *pBuf=strRec;
    while(1)
    {
    memset(read,0,sizeof(read));
    int num=skrecv.Receive(read,4000,0);
    if(num==SOCKET_ERROR)
    {
    //出错了,加入你的处理 
    MessageBox(NULL,"接收出错啦","错误",MB_OK);
    break;
    }
    else
    {
    if(num>0)
    {
    //这段代码的计算也许有错,如果错了,就把指针再加1来试试吧
    //memcpy(pBuf,read,num);
    // pBuf+=num;
    if(a==1)
    {
    DeleteFile("E:\\recv.bmp");
    a++;
    }
    CFile f;
    f.Open("E:\\recv.bmp",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::typeBinary);//
    f.SeekToEnd ();
    f.Write(read,num);
    //f.Write ("\r\n",2);
    f.Close ();
    }
    else if(num==0)
    { //接收完毕,加入你的处理
    break;
    }
    else
    {
    //出错了,加入你的处理
    MessageBox(NULL,"接收出错啦2","错误",MB_OK);
    break;
    }
    }
    }//while(1)

    skrecv.Close ();

    } return 0;
    }
    //发
    void CCNetProgDlg::OnSend() 
    {
    // TODO: Add your control notification handler code here
    UpdateData(TRUE);
    CString strTemp;
    GetDlgItem(IDC_EDIT_TEXT)->GetWindowText(strTemp);
    strTemp.TrimLeft();strTemp.TrimRight();
    if(strTemp=="")
    strTemp="没有输入文本";
    CSocket sk;
    sk.Create ();
    if(!sk.Connect ("172.16.8.221",9000))
    {
    MessageBox("连接目标失败","网络错误",MB_OK);
    sk.Close ();
    return;
    }
    sk.Send (strTemp,strTemp.GetLength (),0);
    sk.Close ();

    }
      

  4.   

    分几次收到是正常的。试一下:
    long len = 0 ;len += receive(receivebuf+len, 20000),
      

  5.   

    分几次收到是正常的。试一下:
    long len = 0 ;len += receive(receivebuf+len, 20000),
      

  6.   

    对,最好是你自己处理头部
    以便接收的时候好知道是什么数据最好不要用recieve()来阻塞线程
      

  7.   

    在流式SOCKET中,分几次收到是正常的。
    另外,可以用GetSockOpt()来得到缓冲的长度,
    一般默认的是8K。
    多次接收的方法就用 rtdb(东临碣石)兄的。
      

  8.   

    我的程序有时候发2000字节,有的时候发20k,所以接收端设最大接收值2k,
    故有时SEVER用
    psocket->send(buf1,200);
    psocket->send(buf2,8000);
    结果client端把两段混在一起了
    但只要
    psocket->send(buf1,200);
    //隔一小段时间
    psocket->send(buf2,8000);
    接收端就能分开两次接收
      

  9.   

    请教SetSockOpt()如何设置接收缓冲区的大小
      

  10.   

    int nValue=1024;
    int nLen=4;
    SetSockOpt(SO_SNDBUF,&nValue,nLen);
    这样就把发送缓冲设为1024BYTES了。
    接收缓冲是SO_RCVBUF,具体看MSDN吧。