背景
QTcpSocket readyread不触发或者只触发几次,readAll()丢数据,收不全数据的原因及解决办法
最近拉手别人的项目,发现 TCP 存在很多问题,如readyread不触发或者只触发几次,readAll()丢数据,收不全数据;
附着问题的解决,这里做一下整理;先挖个坑,有赶时间填上;
一、为什么TCP会粘包, 为什么UDP 不会
TCP是面向流的的传输协议,发送端可以一次发送不定长度的数据,而接收端也可以一次提取不定长度的数据。即这种传输方式是无保护消息边界的。
UDP是面向数据报的传输协议,发送的UDP报文都被接收端视为一条消息,若消息太长被分片,UDP协议也会完成组合后才呈现在内核缓冲区;且UDP报文有消息头,对于接收端来说,易于区分处理。即这种传输方式是有保护消息边界的。
二、TCP粘包现象产生原因
TCP为了提高传输效率,会在收集到足够多数据后才一起发送;有时一条数据太长,TCP还会将数据进行拆分发生;有时发送过快,都会造成粘包。