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