首页 未命名正文

linux编程_Linux tcp传输黏包解决方案

云返利网 未命名 2020-05-26 09:08:29 10 0

tcp/ip协议使用"流式"(套接字)举行数据的传输,就是说它保证数据的可达以及数据抵达的顺序,但并不保证数据是否在你吸收的时刻就到达,稀奇是为了提高效率,充分利用带宽,底层会使用缓存手艺,详细的说就是使用Nagle算法将小的数据包放到一起发送,然则这样也带来一个使用上的问题——黏包,黏包就是说一次将多个数据包发送出去,导致吸收方不能举行正常的剖析,示意图如下:

发生黏包一样平常有两种缘故原由,一种是发送方举行了不应缓冲的缓冲,好比上图中,收发双方协议好根据一定的规则举行编写/剖析报文,然则由于Nagle算法,可能泛起发送方一次发送了1.5个数据包,而吸收方只剖析了前面的1个包,后面的0.5个由于数据不完整而剖析失败,造成数据的丢失或错位,很可能会影响之后所有的数据剖析事情。由于发送方导致的黏包问题可以使用setsockopt()来解决

int enable=1;
setsockopt(sockfd,IPROTO_TCP,TCP_NODELAY,(void*)&enable,sizeof(enable))

这条指令可以克制发送方使用Nagle算法,一组数据被写入就会立刻被发出,不需要守候mtu被填满。

此外,吸收方处置欠妥也可能导致黏包问题,若是发送方将4个包发送到吸收方的缓冲区,然则由于频仍的存取,可能有一次只取了2.5个包,就会导致黏包问题。吸收方的黏包问题可以使用recv(sockfd,buf,sizeof(buf),MSG_WAITALL)来解决,MSG_WAITALL可以强制吸收方收到sizeof(buf)那么多的数据才返回,而buf的巨细可以是收发双方约定好的巨细。
发送一次发送这么多,吸收一次吸收这么多,就可以制止黏包问题。

【关于云返利网】

云返利网是阿里云、腾讯云、华为云产品推广返利平台,在各个品牌云产品官网优惠活动之外,云返利网还提供返利。您可以无门槛获得阿里云、华为云、腾讯云所有产品返利,在官网下单后就可以领取,无论是自己用、公司用还是帮客户采购,您个人都可以获得返利。云返利网的目标是让返利更多、更快、更简单!详情咨询13121395187(微信同号)