首页 > 其他分享 >分包与粘包

分包与粘包

时间:2024-10-15 13:18:51浏览次数:10  
标签:tmp buffer 报文 len 粘包 分包 buf

一 TCP粘包和分包概念

粘包:tcp接收到数据之后,有序放在接收缓冲区中,数据之间不存在分隔符的说法,如果接收方没有及时的从缓冲区中取走数据看上去就象粘在了一起。

分包:tcp报文的大小缺省是1460 字节,如果发送缓冲区中的数据超过1460字节,tcp将拆分成多个包发送,如果接收方及时的从接收缓冲区中取走了数据,看上去像就接收到了多个报文。

二 粘包和分包解决方法

  • 采用固定长度的报文。即发送端固定发送30B,接收端固定接收30B,就不会粘包和分包。

  • 在报文前面加上报文长度。 报文头部(4字节的整数)+报文内容。

  • 报文之间用分隔符。http协议\r\n\r\n。

三 解决粘包和分包的代码示例

采用方法二,即:在报文前面加上报文长度。 报文头部(4字节的整数)+报文内容。

发送端:

        memset(buf,0,sizeof(buf));
        sprintf(buf,"这是第%d个报文。",ii);
        int len = strlen(buf);
        char tmp[1024];
        memset(tmp,0,sizeof(tmp));
        memcpy(tmp,&len,4);		//前四个字节存放报文长度
        memcpy(tmp+4,buf,strlen(buf));	//后四个字节存放保温内容
        if (send(sockfd,tmp,len+4,0) <=0)       // 把命令行输入的内容发送给服务端。
        { 
            printf("write() failed.\n");  close(sockfd);  return -1;
        }

接收端:

		bzero(&buffer, sizeof(buffer));
        int len;
        ssize_t nread = read(evs[ii].data.fd, &len, 4);    // 这行代码用了read(),也可以用recv(),一样的,不要纠结。
        if (nread > 0)      // 成功的读取到了数据。
        {
            bzero(&buffer, sizeof(buffer));
            nread = read(evs[ii].data.fd,buffer,len);
            printf("len=%d,%s\n",len,buffer);	//%d输出len中内容。
        } 

标签:tmp,buffer,报文,len,粘包,分包,buf
From: https://blog.csdn.net/weixin_56520780/article/details/142936945

相关文章

  • 远程升级频频失败?你可能忽略了模组差分包…
    去年开发的一个项目产品,用的是合宙4G-Cat.1低功耗模块Air780E。最近有客户反馈在乡村里频繁出现掉线的情况。通过换货、换SIM卡对比排查测试,发现只有去年5月22号采购的那批模块在客户环境附近会出现掉线的情况,而今年4月份采购的模块批次就不会掉线,很奇怪。我联系了对应负责的销售,了......
  • 蓝牙BLE开发——如何将二进制数据进行分包发送?
    如何将二进制数据进行分包发送最近忙的比较少更新,中秋佳节即将来临,祝大家中秋节快乐!前段时间有个需求,读取.bin文件,完成设备升级功能…,记得当时读取文件大小约9万多个字节,必然少不了对传输数据进行分包的操作。今天分享如何对数据分割为所需的大小,如果没有别的需求的,就......
  • 25. Socket与粘包问题
    1. Socket概念Socket允许应用程序通过它发送或接收数据,对其进行像对文件一样的打开、读写和关闭等操作,从而允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。Socket是应用层与传输层之间的接口,提供了一种标准的通信方式,使得不同的程序能够在网络上进行数据交换......
  • 小程序分包的使用
    配置分包{"pages":["pages/index/index","pages/logs/logs"],"subpackages":[{//分包根目录和app.json同级"root":"subpackage1",//分包1的根目录"pages":[......
  • 粘包现象 | wireshark抓包的使用
    在TCP协议的通信过程中,由于其面向流的特性,数据在传输过程中可能会发生粘包现象,即多个发送的数据包被接收方一次性接收,导致应用层无法正确解析数据。1.粘包现象概述TCP协议为了保证传输效率,可能会将多次send调用发送的数据合并在一个TCP报文中发送出去。这样,接收方在读取时就......
  • 什么是粘包(TCP)
    粘包(粘连包,TCP粘包)是网络编程中常见的问题,通常发生在使用TCP协议进行数据传输时。粘包问题的产生源于TCP协议的特性以及它是一个面向字节流的传输协议。粘包的原因1.TCP是面向流的协议:在TCP连接中,发送的数据被看作一个连续的字节流,而不是离散的消息。因此,接收端在从......
  • 高手过招--论TCP之粘包的解决方法
    粘包,就是查询的内容都粘到一起了,比如客户端发送ipconfig/all命令到服务端,客户端的只收取一次服务端的返回结果,且设置为一次只能取出1024个字节的数据。假设ipconfig/all这条命令的返回结果大小是2048个字节,这就意味着还有1024没有取出来,仍然会保存在客户端的缓存中。此时客户端......
  • 微信小程序分包问题1——如何分包
    为什么要分包:在开发小程序中,我上传体验版代码时,发现项目总体积过大,上传不上去,因此需要做分包处理。1.什么是分包分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。2.分包的好处对小程序进行分包的好处主要有以下两......
  • 粘包和分包
    了解粘包和分包的问题为什么会存在?粘包和分包是利用socket在TCP协议下内部的优化机制。是它内部的一个传输机制导致的。粘包:多条数据包之间粘在一起变成一个包。(因为发送消息比较频繁;每个包的消息很小;TCP想解决频繁发送造成浪费的性能问题)⚠️服务器端接收的消息可能不是一条,可能......
  • 计算机网络 TCP粘包问题
    什么是粘包?粘包是指的是数据和数据之间没有没有明确的分界线,导致不能够正确的传输数据(只有TCP会粘包UDP永远不会粘包),粘包问题只针对于一切字节流的协议。TCP也可以称为流式协议,UDP称为数据报式协议。对于流式协议:发送端可以1K1K的发送数据,接收端可以2k2k的提取数据,也可以......