协议在底层接收了一段长度为 1.5k (单位为byte)的数据
缓冲大小设置为 1k 分两次用 recv() copy 出来的时候,得到如下的数据(数据出现了错误,而且仅仅是一个字节出现了错误!!)
08121204626F73731A
6*0973686F77206D6520746865206D6F6E65792C646677657765323133313332337273646661736632333266323366323366723332663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372736164666166617766323332337264666173646666323334723331327232337233327266736164666177663266323372663233723332723332723332337233327233327232337232337261
缓冲大小设置为 2k 用 recv() 一次性将所有数据复制出来的时候(此时得到的是正确地数据):
08121204626F73731A
E30973686F77206D6520746865206D6F6E65792C646677657765323133313332337273646661736632333266323366323366723332663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372736164666166617766323332337264666173646666323334723331327232337233327266736164666177663266323372663233723332723332723332337233327233327232337232337261
接收相关的代码如下(接收的逻辑是放在子线程里面执行的):
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;
}
坐等高手帮看一下代码的问题出在哪里,提前感谢!