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


为什么会粘包,分包?

相关推荐
认真的酒窝4 小时前
自己动手开发编译器(十一)语义分析
java·开发语言
Piko6146 小时前
H3C IRF2 堆叠实战:打造高可靠核心交换网络
运维·网络·笔记
wbs_scy6 小时前
Linux C++ 高并发编程:线程池全链路深度解析,从原理到手撕实现
java·开发语言
JAVA面经实录9176 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
Full Stack Developme7 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
茯苓gao9 小时前
嵌入式开发笔记:CANopen相关移位运算与通信协议术语详解
网络·嵌入式硬件·学习·信息与通信
万联WANFLOW9 小时前
SD-WAN 控制平面高可用怎么做?SDWAN 控制器挂了,全网会发生什么
运维·网络·分布式·架构
酱学编程9 小时前
【从零到一实现一个 AI Agent 框架 · 第四篇】04. 任务规划:拆解复杂目标 -
服务器·网络·数据库·人工智能
程序员老油条10 小时前
WSL2 + Docker Desktop:Windows 下的完美 Java 开发环境
java·windows·docker·wsl2
shushangyun_11 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习