背景 

QTcpSocket readyread不触发或者只触发几次,readAll()丢数据,收不全数据的原因及解决办法

最近拉手别人的项目,发现 TCP 存在很多问题,如readyread不触发或者只触发几次,readAll()丢数据,收不全数据;

附着问题的解决,这里做一下整理;先挖个坑,有赶时间填上;

一、为什么TCP会粘包, 为什么UDP 不会

TCP是面向流的的传输协议,发送端可以一次发送不定长度的数据,而接收端也可以一次提取不定长度的数据。即这种传输方式是无保护消息边界的。

UDP是面向数据报的传输协议,发送的UDP报文都被接收端视为一条消息,若消息太长被分片,UDP协议也会完成组合后才呈现在内核缓冲区;且UDP报文有消息头,对于接收端来说,易于区分处理。即这种传输方式是有保护消息边界的。

二、TCP粘包现象产生原因

TCP为了提高传输效率,会在收集到足够多数据后才一起发送;有时一条数据太长,TCP还会将数据进行拆分发生;有时发送过快,都会造成粘包。

三、解决方案:

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐