IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 流式包处理,c++,粘包,半包,tcp -> 正文阅读

[网络协议]流式包处理,c++,粘包,半包,tcp

.cpp

bool NetworkManager::handle_data(TArray<uint8>& received_data, int _byte_cnt)
	{
		uint32_t handled_offset = 0;
		while (handled_offset != _byte_cnt)
		{
			auto byte_cnt_left = _byte_cnt - handled_offset;
			//头上一次未接收全
			if (data_handle_record.head_rec_cnt < DataHandleRecord::Data_Head_Size)
			{
				//头本次还是未收全
				if (byte_cnt_left + data_handle_record.head_rec_cnt < DataHandleRecord::Data_Head_Size)
				{
					memcpy(data_handle_record.get_head_write_pos(),
						received_data.GetData(),
						//接收大小
						byte_cnt_left);
					data_handle_record.head_rec_cnt += byte_cnt_left;

					return true;
					//return false;
				}
				//头本次收全
				else
				{
					handled_offset += DataHandleRecord::Data_Head_Size - data_handle_record.head_rec_cnt;

					memcpy(data_handle_record.get_head_write_pos(),
						received_data.GetData(),
						//剩余大小
						DataHandleRecord::Data_Head_Size - data_handle_record.head_rec_cnt);
					data_handle_record.head_rec_cnt = DataHandleRecord::Data_Head_Size;

					data_handle_record.update_body_buff_size();
					//准备好vector空间
					continue;
				}

			}
			//处理body pack
			// 1.剩余数据小于需要读的包数量(不够
			if (byte_cnt_left < data_handle_record.pack_head.pack_len -
				data_handle_record.body_rec_cnt)
			{
				//memcpy(data_handle_record,)
				data_handle_record.write_data_2_body(received_data.GetData(), byte_cnt_left);
				handled_offset += byte_cnt_left;
			}
			else
				//完成读包
			{
				auto len = data_handle_record.pack_head.pack_len -
					data_handle_record.body_rec_cnt;
				data_handle_record.write_data_2_body(received_data.GetData(), len);
				handled_offset += len;

				//处理包
				// ...

				//重置状态
				data_handle_record.reset();
			}
		}
		//根据
		return true;
	}

.h

struct PackHead
	{
		uint8_t pack_id;
		uint32_t pack_len;

	};
	//};
	struct DataHandleRecord
	{
		static const uint8_t Data_Head_Size = 5;
		PackHead pack_head;
		uint8_t head_rec_cnt = 0;
		std::vector<uint8_t> body_buff;
		uint32_t body_rec_cnt = 0;

		//接受完头后就调用
		void update_body_buff_size()
		{
			//只增不减
			if (body_buff.size() < pack_head.pack_len)
			{
				body_buff.resize(pack_head.pack_len);
			}
		}
		void reset()
		{
			head_rec_cnt = 0;
			body_rec_cnt = 0;
			//body_data.resize(0);// = 0;
		}
		void* get_head_write_pos()
		{
			return static_cast<void*>(&pack_head + head_rec_cnt);
		}
		void* write_data_2_body(const void* src, uint32_t len)
		{
			memcpy(&body_buff + len, src, len);
			body_rec_cnt += len;
		}
	};
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-24 15:54:18  更:2021-08-24 15:57:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:23:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码