TCP 中粘包的产生和解决

当发送方的“发送速度”大于接收方的“处理速度”时,就会出现问题。
比如:接收方一直没有处理,发送方第一次发送一个包大小为 100 字节,第二次发送 200 字节,则缓冲区内有数据 300 字节,当接收方从缓存区中取数据时,就无法决定该从何处将 2 个数据包分开,这种问题就是粘包问题。
TCP 粘包:发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。
为了避免粘包现象,可采取以下几种措施:
(1)添加结尾标记:比如 \n ,则需要用到 Readline 函数;
(2)数据包封装:数据包头 + 数据 ,其中数据包头是一个结构体,这个结构体中有成员数据类型和数据长度。每次传输数据时候,加包头,每次解析包,先固定读取前 4 个字节,得到长度,再读取指定长度,需要用到Readn 函数。
(3)数据包定长:定长要足够,定长 100,包 50 字节,另 50 字节填充,接收方定长解析,显然适用于数据包长度波动不大的条件下,避免流量浪费。
上述用到的函数,在我之前的文章“套接字错误处理函数的封装思想及函数实现”中讲到过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值