协议在底层接收了一段长度为 1.5k (单位为byte)的数据
缓冲大小设置为 1k 分两次用 recv() copy 出来的时候,得到如下的数据(数据出现了错误,而且仅仅是一个字节出现了错误!!)
08121204626F73731A
6*0973686F77206D6520746865206D6F6E65792C646677657765323133313332337273646661736632333266323366323366723332663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372736164666166617766323332337264666173646666323334723331327232337233327266736164666177663266323372663233723332723332723332337233327233327232337232337261
缓冲大小设置为 2k 用 recv() 一次性将所有数据复制出来的时候(此时得到的是正确地数据):
08121204626F73731A
E30973686F77206D6520746865206D6F6E65792C646677657765323133313332337273646661736632333266323366323366723332663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372663266323366323364616177663233333433327172657766617364663479343533326531646164736661723233723233723233723272323372333264736166736466323372333272323372736164666166617766323332337264666173646666323334723331327232337233327266736164666177663266323372663233723332723332723332337233327233327232337232337261
接收相关的代码如下(接收的逻辑是放在子线程里面执行的):
void* RecvBytesThread::execute() {
SocketModule* t_pSocketModule = (SocketModule*)m_pSocketModule;
int t_iSocketFd = t_pSocketModule->getSocketFd();
unsigned char* t_pArrCharFull = NULL;
unsigned char t_oArrCharBuf[BUFFER_SIZE];
memset(t_oArrCharBuf, 0, sizeof(t_oArrCharBuf));
int tmp_iRecvLen = (int)::recv(t_iSocketFd, t_oArrCharBuf, sizeof(t_oArrCharBuf), 0);
printf("Connection broken or receiving data from server failed!\n");
printf("从协议存储中 copy 出了一段长度为 %d 的数据~\n", tmp_iRecvLen);
t_iDataSize = bytes2int(t_oArrCharBuf);
if (t_iDataSize == tmp_iRecvLen - 4) {
echo(t_oArrCharBuf + 4, t_iDataSize);
} else if (t_iDataSize > tmp_iRecvLen - 4) {
t_pArrCharFull = new unsigned char[t_iDataSize];
memset(t_pArrCharFull, 0, t_iDataSize);
memcpy(t_pArrCharFull, t_oArrCharBuf + 4, sizeof(t_oArrCharBuf) - 4);
t_iRemain = t_iDataSize - (tmp_iRecvLen - 4);
memcpy(t_pArrCharFull + (t_iDataSize - t_iRemain), t_oArrCharBuf, tmp_iRecvLen);
t_iRemain -= tmp_iRecvLen;
echo(t_pArrCharFull, sizeof(t_pArrCharFull));
坐等高手帮看一下代码的问题出在哪里,提前感谢!