经过网络查找资料,读过下面几篇文章之后,感觉受益匪浅。谢谢分享!
- 原文引用 https://bbs.csdn.net/topics/390666084/
如图,这里我是一个 switch();循环,全面几个 case是 接收数据头大小;包长,版本号,数据,等等;
执行到这个部分呢,套接字缓冲区是没有数据了的,只会等待服务端发送 文件数据过来;
m_fileSize //这是文件的大小;
但是当我读完了 m_fileSize;大小的数据后,发现 套接字缓冲区竟然还有 512Byte数据;
我就搞不懂 怎么出现的512Byte数据了/ 所以用 m_tcpClient->read( m_tcpClient.size());清空缓冲区了;;;;;所以 我把512Byte数据联想到了 是不是文件末尾的结束符占用了 这 512Byte;~!
- 原文引用 https://blog.csdn.net/ying_593254979/article/details/17006507
1、当触发readyRead信号,但是缓冲区的长度小于另一端发送的数据。这样就会触发多次readyReady信号。如果一次槽函数里面读取缓冲区的长度,数据就会接受不全,进行数据处理肯定会出问题。Qt的例子中提供了一种方法。在发送数据的头部加上数据的长度。只有当bytesAvailable大于数据的长度时,才读取数据。
2、系统API里面调用read是从系统缓冲区里面读取数据。如果系统缓冲区满的话。以前的就会被覆盖。但是Qt里面也存在缓冲区。如果一端发送数据。另一端并不从Qt缓冲区读取数据。那么Qt就会无限制的从系统缓冲区中读出数据放置自己内部缓冲区。最后肯定会出现堆栈满的情况,系统异常退出。
想进一步了解Qt网络的东西,可以搭建调试环境。自己调试来分析源码,查找原因。
- 原文引用 https://bbs.csdn.net/topics/391027979
QIODevice(QTcpSocket是QIODevice的子类)有内部缓冲区,如果不设置固定大小,会根据你要写入的数据,不断地重新分配内存。你可以自己设置一个门限,比如512K,每次写入前调用一下bytesToWrite(),看看剩余未写入数据有多少,如果接近你设置的门限,就等下一轮再调用write,这样可以避免内存碎片。