::recv(*pReceiveMframe->m_pClientSocket, bufTemp, BUFFLENGTH, 0);如上语句,如果我发现了bufTemp中的数据是我要接收的,那么,我怎么样去接收下条信息呢?
关于缓冲如何设置????

解决方案 »

  1.   

    应该先判断是否有数据可接收,然后执行recv()接收。
      

  2.   

    请问你socket是用MFC的封装类,还是单单一个句柄采用套接字模型?
      

  3.   

    See the sample below ,useful :http://www.codeproject.com/useritems/structure_bit_ordering.asp
      

  4.   

    如果用MFC封装的更简单了。
    有数据到的话会执行OnReceive()事件,在这个函数里接收数据。每次有数据到时都会执行这个函数。
      

  5.   

    这个我当然知道,但是我现在不用OnReceive()事件。如果我用那个,我就不会问上面的问题了!
      

  6.   

    现象是不是那条数据在copy,例子,发hello,第一次收到的是hello,第二次hellohello,第三次hellohellohello?
      

  7.   

    如果是那样的话你应该每接受一次,收完就将缓冲次清空,或者构造一个函数(这个函数只执行::recv(*pReceiveMframe->m_pClientSocket, bufTemp, BUFFLENGTH, 0);)然后在调用Recv的地方调用所构造的函数,这样也能起到清空缓冲池的作用
      

  8.   

    recv最后个参数是将buffer清空了的。 你用什么模式?异步还是阻塞?
    如是异步,可以先得到它的缓冲区数据长度,再接收:
    int Len;
    ioctlsocket(s, FIONREAD, &len);
    char buffer[] = new char[len];
    recv(s, buffer, len, 0);
    /* or
     while (len > 0)
     {
       int ret = recv(s, buffer, BUFFERLEN, 0);
       len -= ret;
       // proc buffer;
     }
    */
    ...如果是阻塞嘛,最好发数据前,发个数据长度,再发数据。
    接收时,先接收数据的长度,然后一点点收啦。一般来说在异步中,如果一方连继发送多个data,而接收方ioctlsocket是
    根据缓冲区来判断长度,所以建议你:发送前,先发个data len给一端,而
    另一端先接收len,再根据它来接收对应长度的data
      

  9.   

    将recv()放在里面每各一段时间接受一次
      

  10.   

    UINT ReceiveThread(LPVOID pParam)
    {
    //获取CMainFrame类的指针
    CMainFrame*   pReceiveMframe = (CMainFrame*)pParam;
    UINT          nReceiveMessLength = 0;
    //定义信息接收缓冲
    char          bufTemp[BUFF_LENGTH];
    unsigned int  bufEmptyLen = BUFF_LENGTH;
    CString strReceive, strTemp;
    //循环检测信息接收缓冲,有信息则接收
    while (m_gbThreadRun)
    {
    //接收信息
    nReceiveMessLength = ::recv(*pReceiveMframe->m_pClientSocket, bufTemp 
    + (BUFF_LENGTH - bufEmptyLen), bufEmptyLen, 0); //判断是否接收到信息,接收到,则分析
    if (nReceiveMessLength < 0  || nReceiveMessLength > bufEmptyLen)
    {
    Sleep(100);
    continue;
    }
    else
    {
    // 判断是否是命令的开头 去掉头部空格
    strTemp.Format("%s", bufTemp);
    while (TRUE)
    {
    CString str;
    if (strTemp.Left(1) == " ")
    {
    str.Format("%s", strTemp.Mid(1));
    strTemp.Empty();
    strTemp.Format("%s", str);
    bufEmptyLen += 1;
    }
    else
    {
    break;
    }
    }
    int len = (UINT)StringToInt(strTemp.Left(4));
    if (len > 0 )
    {
    m_gstrReceiveBuff.AddHead(strTemp.Left(len));
    strcpy(bufTemp, strTemp.Mid(len));
    // 重新设置缓冲的空闲大小
    bufEmptyLen -= nReceiveMessLength;
    bufEmptyLen += len;
    }
    }
    Sleep(100);
    }
    return 0;
    }