客户端接收到服务端的消息后,可能由于服务端发送过快,系统缓冲区满了,造成粘包,我们需要拆包处理消息数据。核心思想就是写一个二级缓冲区,将收到的数据拷贝至二级缓冲区中对消息一个一个处理!
这只是解决粘包问题其中一个方法
//缓冲区最小单元大小
#define RECV_BUFF_SIZE 10240
//接受缓冲区
char _szRecv[RECV_BUFF_SIZE] = {};
//第二缓冲区 消息缓冲区
char _szMsgBuf[RECV_BUFF_SIZE * 10] = {};
//消息缓冲区尾部位置
int _lastPos = 0;
//接收数据 需要处理粘包、分包问题
int RecvData(SOCKET sock)
{
int nLen = recv(sock, _szRecv, RECV_BUFF_SIZE, 0);
//printf("nLen=%d\n",nLen);
if (nLen <= 0)
{
printf("<socket=%d>与服务器断开连接,任务结束\n", _sock);
return -1;
}
//将收到的数据拷贝到消息缓冲区
memcpy(_szMsgBuf+_lastPos, _szRecv, nLen);
//消息缓冲区的数据尾部位置后移
_lastPos += nLen;
while(_lastPos >= sizeof(DataHeader))//判断消息缓冲区数据长度大于消息头DataHeader长度
{
DataHeader* header = (DataHeader*)_szMsgBuf;
//判断消息缓冲区的长度大于消息长度
if (_lastPos >= header->dataLength)
{
int nSize = _lastPos - header->dataLength;//消息缓冲区剩余未处理长度
//处理网络消息
OnNetMsg(header);
//将未处理消息数据前移 以便下一次处理
memcpy(_szMsgBuf,_szMsgBuf+header->dataLength,nSize);
//尾部位置前移
_lastPos = nSize;
}else{
break;//消息缓冲区不够一条完整消息
}
}
return 0;
}