qt套接字内存溢出问题资料收集

经过网络查找资料,读过下面几篇文章之后,感觉受益匪浅。谢谢分享!

  1. 原文引用 https://bbs.csdn.net/topics/390666084/

如图,这里我是一个 switch();循环,全面几个 case是 接收数据头大小;包长,版本号,数据,等等;
执行到这个部分呢,套接字缓冲区是没有数据了的,只会等待服务端发送 文件数据过来;
m_fileSize //这是文件的大小;
但是当我读完了 m_fileSize;大小的数据后,发现 套接字缓冲区竟然还有 512Byte数据;
我就搞不懂 怎么出现的512Byte数据了/ 所以用 m_tcpClient->read( m_tcpClient.size());清空缓冲区了;;;;;所以 我把512Byte数据联想到了 是不是文件末尾的结束符占用了 这 512Byte;~!


  1. 原文引用 https://blog.csdn.net/ying_593254979/article/details/17006507

1、当触发readyRead信号,但是缓冲区的长度小于另一端发送的数据。这样就会触发多次readyReady信号。如果一次槽函数里面读取缓冲区的长度,数据就会接受不全,进行数据处理肯定会出问题。Qt的例子中提供了一种方法。在发送数据的头部加上数据的长度。只有当bytesAvailable大于数据的长度时,才读取数据。

2、系统API里面调用read是从系统缓冲区里面读取数据。如果系统缓冲区满的话。以前的就会被覆盖。但是Qt里面也存在缓冲区。如果一端发送数据。另一端并不从Qt缓冲区读取数据。那么Qt就会无限制的从系统缓冲区中读出数据放置自己内部缓冲区。最后肯定会出现堆栈满的情况,系统异常退出。
想进一步了解Qt网络的东西,可以搭建调试环境。自己调试来分析源码,查找原因。


  1. 原文引用 https://bbs.csdn.net/topics/391027979

QIODevice(QTcpSocket是QIODevice的子类)有内部缓冲区,如果不设置固定大小,会根据你要写入的数据,不断地重新分配内存。你可以自己设置一个门限,比如512K,每次写入前调用一下bytesToWrite(),看看剩余未写入数据有多少,如果接近你设置的门限,就等下一轮再调用write,这样可以避免内存碎片。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值