【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);


为什么会粘包,分包?

相关推荐
一杯奶茶¥7 分钟前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
不能只会打代码9 分钟前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛
小刘|10 分钟前
Spring AI Alibaba 集成和风天气 API 实战
java·服务器·前端
KANGBboy14 分钟前
java知识五(继承)
java·开发语言
AI人工智能+电脑小能手17 分钟前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试
DIY源码阁20 分钟前
JavaSwing饮品管理系统 - MySQL版
java·数据库·mysql·eclipse
二哈赛车手1 小时前
新人笔记---最终版智能体图片分析完整方案,包括一些总结于经验,以及各种优化点讲解
java·笔记·spring·ai·springboot
森G1 小时前
61、信号与槽机制在 TCP 编程中的应用---------网络编程
网络·c++·qt·网络协议·tcp/ip
Maynor9961 小时前
我用 Codex 给自己的网站上线了一个智能体客服:从 Dify 到服务器部署,全程实战复盘
运维·服务器
泡^泡1 小时前
Spring AI简单高仿DeepSeek问答页面
java·人工智能·spring