【Linux】粘包问题

粘包问题

TCP服务特点

在这里插入图片描述
在这里插入图片描述

粘包

​ 多次数据发送, 多次发送的数据首位相连, 接收端接收的时候不能正确区分第一次发送多少, 第二次发送多少。

​ 比如对方连续发送两次数据,然后读数据的时候第一次没有读完,剩余的数据会在第二次读走,第一次读取数据不完整导致剩余数据归并到第二次读取的数据,这种情况就属于粘包。

​ 粘包的产生会对后面数据的逻辑判断产生影响,但对于粘包的处理取决于粘包是否有影响,如果粘包会产生影响就需要我们去解决,没有影响可以选择不解决(比如文件传输没有影响)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nvUaHglu-1667544827292)(C:\Users\Iric Zhang\AppData\Roaming\Typora\typora-user-images\image-20221104143834778.png)]

解决粘包的方法

(1)报头 + 数据

报头可以用前四个字节表示长度,之后的的长度表示数据内容

例如:4位的数据长度+数据 -----------> 0010 1234567890

其中0010表示数据长度, 1234567890表示10个字节长度的数据,另外, 发送端和接收端可以协商更为复杂的报文结构, 这个报文结 构就相当于双方约定的一个协议

(这种方式是项目中使用最多的方法,不会发生错误)

(2)添加结尾标记

需要发送方和接收方协商确定,效率比较低,所以不建议使用

例如:协商确定每次发送数据的最后一个字符为\n\ $等

(3)数据包定长

每次发送数据的长度以及数据内每一段的内容都需要双方协商确定,相当于数据部分的协议,开发中叫做规约或者接口文档,也叫做接口
这种方式使用不多,因为在不同业务下对于数据的规定不同,使用定长数据不适合在之后业务中去使用

例如:发送方和接收方约定, 每次只发送128个字节的内容, 接收方接收定长128个字节就可以了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值