其他分享
首页 > 其他分享> > 客户端、服务端解决粘包问题

客户端、服务端解决粘包问题

作者:互联网

客户端接收到服务端的消息后,可能由于服务端发送过快,系统缓冲区满了,造成粘包,我们需要拆包处理消息数据。核心思想就是写一个二级缓冲区,将收到的数据拷贝至二级缓冲区中对消息一个一个处理!
这只是解决粘包问题其中一个方法

//缓冲区最小单元大小
#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;
	}

标签:lastPos,粘包,header,消息,缓冲区,nLen,szMsgBuf,服务端,客户端
来源: https://blog.csdn.net/weixin_46258483/article/details/122450900