我在SERVER端先发送一个字符串(是我要发送包的长度)。然后发送我实际要发的数据。
      pSocket->Send( LPCTSTR(ss),strlen( ss ));
      pSocket->Send( LPCTSTR(m_infoSer),m_infoSer.GetLength()); 我在CLIENT端接受的时候先是接受第一次发送的字符串,然后循环接收。
可是我发现我在第一次接受的数据里面有第二次发送的数据。这是什么原因啊?
是不是我在发送第一次的时候要做什么处理??
      WSARecv( m_pClient, &dlenbuf, 1, &bLen, &Flags, NULL, NULL)(接收后dlenbuf里面有m_infoser的数据,我想让dlenbuf只有ss数据该怎么办?)

解决方案 »

  1.   

    谢谢yanhuahui:
      我还有两个问题
      1。怎样清空缓冲区
      2。在第一次发送后清空缓冲区,然后第二次发送其他数据,我在接受的时候需要接受很多次,是不是响应一次FD_READ时间就行了?
      

  2.   

    一个简单方法:发送长度时使用固定字节数, 如
     pSocket->Send( LPCTSTR(ss),10);接受方就好处理了.BTW:
    RECV和SEND并不是一一对应的,
    一次RECV到多次SEND的数据是正常的.
      

  3.   

    tcp本来就是一个“流”式协议,它的信息息是没有边界的。你可以把字符串的长度做为一个long型的值放在你要传的字符串前面,发过去,或者你现在这样也可以。只是在收的时候,把你收的前四个字节变成数字,就可以知道传过来的字符串有多长,根据你现在接收的数量你可以循环接收知道接收了所有的字符。
      

  4.   

    晕...我是说"使用固定字节数" 发送长度, 
    不是"固定长度".例如:
     pSocket->Send( LPCTSTR(ss),10);这样前十个字节就是长度,
    后面的就是内容.
      

  5.   

    CXxx::OnReceive(int ErrorCode)
    {
       char buf[1025];
       CString str;
       long bytestoread = 0;   int n = Receive(buf,1024,0);
       buf[n] = '\0';   long* p = (long*)buf;
       bytestoread = *p;
       num = n - sizeof(long);
       str = (char*)buf + 4;   
       while(num < bytestoread)
       {
          n = Receive(buf,1024,0);
          buf[n] = '\0';
          str += (char)buf;
          num += n;
       }
    }
      

  6.   

    呵呵,这种情况我也碰到过.
    你可以这样:
    //接收长度
    WSARecv( m_pClient, &dlenbuf, 1, &bLength, &Flags, NULL, NULL);//bLength为你发送的包的长度
    while(1)//循环接收数据
    {
        WSARecv( m_pClient, &dlenbuf, 1, &bLen, &Flags, NULL, NULL);
                 //bLen为你每次发送的数据的长度
    }
      

  7.   

    哦!你是用的异步I/O.
    对,只响应一次FD_READ事件就行了!你可以这样做:
    BOOL RevPacketFlag = TRUE;
    FD_READ:
         if (RevPacketFlag)
    {
       //接收长度
       WSARecv( m_pClient, &dlenbuf, 1, &bLength, &Flags, NULL, NULL);//bLength为你发送的包的长度   RevPacketFlag = FALSE;
    }
    else
    {
       WSARecv( m_pClient, &dlenbuf, 1, &bLen, &Flags, NULL, NULL);
                 //bLen为你每次发送的数据的长度
          if ()//如果数据已经接收完了
          { 
             处理....
             RevPacketFlag = TRUE;
           }
    }