bsd socket 接收缓冲长度不够时接收出错的有关问题

bsd socket 接收缓冲长度不够时接收出错的问题协议在底层接收了一段长度为 1.5k (单位为byte)的数据缓冲大

bsd socket 接收缓冲长度不够时接收出错的问题
协议在底层接收了一段长度为 1.5k (单位为byte)的数据
缓冲大小设置为 1k 分两次用 recv() copy 出来的时候,得到如下的数据(数据出现了错误,而且仅仅是一个字节出现了错误!!)

08121204626F73731A6*0973686F77206D6520746865206D6F6E65792C646677657765323133313332337273646661736632333266323366323366723332663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372736164666166617766323332337264666173646666323334723331327232337233327266736164666177663266323372663233723332723332723332337233327233327232337232337261
缓冲大小设置为 2k 用 recv() 一次性将所有数据复制出来的时候(此时得到的是正确地数据):
08121204626F73731AE30973686F77206D6520746865206D6F6E65792C646677657765323133313332337273646661736632333266323366323366723332663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372736164666166617766323332337264666173646666323334723331327232337233327266736164666177663266323372663233723332723332723332337233327233327232337232337261


接收相关的代码如下(接收的逻辑是放在子线程里面执行的):

void* RecvBytesThread::execute() {
//    printf("RecvBytesThread::execute()\n");
    
    SocketModule* t_pSocketModule = (SocketModule*)m_pSocketModule;
    int t_iSocketFd = t_pSocketModule->getSocketFd();
    
    int t_iRemain = 0;
    int t_iDataSize = 0;
    unsigned char* t_pArrCharFull = NULL;
    // 在栈中建立的数组,用于盛放接收来的数据
    unsigned char t_oArrCharBuf[BUFFER_SIZE];
    
    do {
        memset(t_oArrCharBuf, 0, sizeof(t_oArrCharBuf));  // sizeof(t_oArrayChar) = 1024
        
        int tmp_iRecvLen = (int)::recv(t_iSocketFd, t_oArrCharBuf, sizeof(t_oArrCharBuf), 0);
        // 检查网络链接(链接断开返回 0)、数据传输(接收出错返回 -1)是否出错~
        if (tmp_iRecvLen <= 0) {
            printf("Connection broken or receiving data from server failed!\n");
            break;
        }
        
        printf("从协议存储中 copy 出了一段长度为 %d 的数据~\n", tmp_iRecvLen);
        
        if (t_iRemain == 0) {
            // 表示这是一次从头开始的接收~
            t_iDataSize = bytes2int(t_oArrCharBuf);
            if (t_iDataSize == tmp_iRecvLen - 4) {
                // 发送过来数据规格小于缓冲规格的情况(只需 recv 一次即可执行解码)~
                echo(t_oArrCharBuf + 4, t_iDataSize);
                
            } else if (t_iDataSize > tmp_iRecvLen - 4) {


                // 发送过来的数据规格大于缓冲规格的情况(需要 recv 多次后才能执行解码)~
                t_pArrCharFull = new unsigned char[t_iDataSize];    // sizeof(t_pArrCharFull)
                memset(t_pArrCharFull, 0, t_iDataSize);
                
                memcpy(t_pArrCharFull, t_oArrCharBuf + 4, sizeof(t_oArrCharBuf) - 4);
                t_iRemain = t_iDataSize - (tmp_iRecvLen - 4);
            }
        } else {
            // 表示这不是一次从头开始的接收~
            memcpy(t_pArrCharFull + (t_iDataSize - t_iRemain), t_oArrCharBuf, tmp_iRecvLen);
            t_iRemain -= tmp_iRecvLen;
            if (t_iRemain == 0) {
                // 可以执行解码操作了~
                echo(t_pArrCharFull, sizeof(t_pArrCharFull));
                // 释放内存~
                delete t_pArrCharFull;
                t_pArrCharFull = NULL;
            }
        }
        
    } while (true);
    
    return NULL;
}


坐等高手帮看一下代码的问题出在哪里,提前感谢! socket recv


[解决办法]
在进行组合前查看接收的原始数据呢? 排除下是组合操作产生的问题.
[解决办法]
不会吧,TCP是流式数据。