【TCP】TCP数据粘包/分包问题

cpp 复制代码
	/*4.阻塞等待上位机(客户端)连接请求*/
				if(netconn_accept(conn,&newconn)==ERR_OK){
					/*5.循环处理接收到的数据*/
					while((err=netconn_recv(newconn,&buf))==ERR_OK){//如果没有新的数据会进入阻塞态
						do{
							//从buf获取数据&data和len
							netbuf_data(buf,&data,&len);//使用线性数组,不用循环数组 为什么?
              memcpy(receiveBuffer+rc_count,data,len);//获取的数据拷贝给缓冲区
              rc_count+=len;//rc_count是当前缓冲区字节数  
              /*用于遍历receiveBuffer[]缓冲区*/
              while(((rc_count-1)-rc_header)>=15 ){//进入条件是:未处理数据>=16字节
                  uint32_t head=(receiveBuffer[rc_header]<<24|
                                 receiveBuffer[rc_header+1]<<16|
                                 receiveBuffer[rc_header+2]<<8|
                                 receiveBuffer[rc_header]);
                  if(head==0xAA55AA55){//*(uint32_t*)(receiveBuffer+rc_header)uint32_t 
                    if(CmdQueueHandle!=NULL){	           //     访问通常期望地址能被 4 整除 如不能对其可能会进入HardFault
									    TCP_Message_t *pPkg=(TCP_Message_t *)(receiveBuffer+rc_header);
									    msg.depth_tar=pPkg->depth_tar;
									    msg.pitch_tar=pPkg->pitch_tar;
									    msg.roll_tar =pPkg->roll_tar;
									    xQueueSend(CmdQueueHandle,&msg,(TickType_t)0);
                      rc_count-=16;
                      /*滑动平移窗口*///缓冲区想象成一条传送带,处理了一个包,就应该把这个包及其前面的所有垃圾全部"剪掉",
                      memmove(receiveBuffer,receiveBuffer+rc_header+16,rc_count-rc_header-16); //把剩下的东西拉到最前面
                      rc_header=0;
								    }					
                  }		
                  else{
                    rc_header++;
                  }
              }
						}while(netbuf_next(buf)>=0);//跳转到下一个内存链表节点 
						netbuf_delete(buf);
					}
					/*客户端断开连接,清理资源*/
					netconn_close(newconn);
					netconn_delete(newconn);
				}
				osDelay(1);


为什么会粘包,分包?

相关推荐
M-Robots echo6 小时前
轻量化裁剪方案解析:M-Robots 模块化构建,适配高低端各类机器人硬件平台
java·机器人·ros·开源社区·atomgit·m-robots
不可求~7 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
zhao3266857517 小时前
静态IP代理固定IP与动态IP的根本差异,账号操作安全性如何体现
网络·网络协议·tcp/ip
mldong7 小时前
用 DDD 设计工作流引擎:聚合根与充血模型
java·架构
躺不平的理查德8 小时前
ARCH与交叉编译器的关系
服务器·arm
mqiqe8 小时前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
伍一518 小时前
03-文件管理模块-一个看似简单的模块藏着多少细节
java·ruoyi·若依
gugucoding9 小时前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g9 小时前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
AC赳赳老秦10 小时前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw