ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-12 17:03:54  阅读:159  来源: 互联网

标签:lastPos 粘包 header 消息 缓冲区 nLen szMsgBuf 服务端 客户端


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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有