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


为什么会粘包,分包?

相关推荐
云烟成雨TD1 小时前
Spring AI 1.x 系列【29】Embedding Model(嵌入模型)
java·人工智能·spring
羽翼未丰的啊博2 小时前
Can_Chart上位机
网络·qt·汽车
幸福巡礼2 小时前
【 LangChain 1.2 实战(四)】构建一个模块化的天气查询 Agent
java·前端·langchain
齐齐大魔王8 小时前
linux-僵死进程处理
linux·运维·服务器
wuminyu11 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
其实防守也摸鱼11 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
网络工程小王12 小时前
【LangChain 大模型6大调用指南】调用大模型篇
linux·运维·服务器·人工智能·学习
wangbing112512 小时前
各linux版本的包管理命令
linux·运维·服务器
callJJ12 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring