比如目前接收的数据样例如下第一次接收:
<+++>
设备告警流水?第二次接收:
? =  21699
网络流水号  =  739641这里第一次和第二次的是“号”,但服务端发过来后,“号”是被拆分到两次发过来的客户端应该如何处理呢?

解决方案 »

  1.   

    http://topic.csdn.net/u/20111129/22/737b7a52-417b-4aae-865e-425a9b87b59d.html
      

  2.   

    增加一个结束符,读到结束符后合并前面记录的Byte数组,然后再转成字符串
      

  3.   

    循环,读取到一个缓存区中,我一般读到一个MEMOSTREAM中,然后,读取完后,再还源出数据~~~
    如何判断读取完成,如果是长连接,可以在传输数据时规定一个开始、结束标志;如果不是,发送完成后,可以关闭SOCKET,然后有个READBUFFER == 0 (这个有点记不清了)可以判断传输己经结束。此时可以去MEMOSTREAM中读取并还原数据
      

  4.   

     看下这个函数
    bool MySocket::reciveMsg(int socket, std::string& s, bool *eof)
    {
    const int READ_SIZE = 4096;   // Number of bytes to attempt to read at a time
    char readBuf[READ_SIZE];

    bool wouldBlock = false;
    *eof = false;

    while ( ! wouldBlock && ! *eof) {
    int n = recv(socket, readBuf, READ_SIZE-1, 0);
    if (n > 0) {
    readBuf[n] = 0;
    s.append(readBuf, n);
    } else if (n == 0) {
    *eof = true;
    } else if (GetError()) {
    wouldBlock = true;
    } else {
    return false;   // Error
    }
    }
      return true;
    }
      

  5.   

    StreamReader 这个类专门就干这事的。如果你想自己反编译一下看看源码。我觉得蛮复杂的。
      

  6.   

    自己解决了
    方法是通过设置头、尾标记确定包内容
    以BYTE[]方式缓存接收到的数据,接收数据后查找头尾标记并取出包内容,
    对于没有匹配的则再次压入缓存