QTcpSocket 内存问题「建议收藏」

QTcpSocket 内存问题「建议收藏」我自己测试也发现反复的connectToHost会有内存泄露,建议谨慎的使用!////////////////////////////////////////////////QTcpSocket类的方法connectToHost会泄露内存,即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险。必须控制connectToH…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

我自己测试也发现反复的connectToHost会有内存泄露,建议谨慎的使用!


QTcpSocket类的方法connectToHost会泄露内存, 即使把调用这个方法的QTcpSocket实例delete掉,内存也不会释放!反复connectToHost会导致段错误,十分危险。必须控制connectToHost的使用次数!

1. 连接服务器
m_tcpSocket->connectToHost(“127.0.0.1”, 9877);
connected = m_tcpSocket->waitForConnected();
只有使用waitForConnected()后,QTcpSocket才真正尝试连接服务器,并返回是否连接的结果。

2. 写数据
m_tcpSocket->write(str.toStdString().c_str(), strlen(str.toStdString().c_str()));
m_tcpSocket->waitForBytesWritten();
当使用waitForBytesWritten()后,QTcpSocket才真正发送数据。
m_tcpSocket->write(str1.toStdString().c_str(), strlen(str1.toStdString().c_str()));
m_tcpSocket->write(str2.toStdString().c_str(), strlen(str2.toStdString().c_str()));
的结果是发送了str1str2

3. 断开与服务器的连接
m_tcpSocket->disconnectFromHost()
m_tcpSocket->waitForDisconnected()

4. 善于使用QTcpSocket的SIGNAL:connected(), disconnected(), error(QAbstractSocket::SocketError)
 配合自定义私有开关变量bool connected, QTimer
 可以实现自动重连接等逻辑。


其他参见:

[经验分享] QTcpSocket调试经验分享

http://www.thisisqt.com/forum/viewthread.php?tid=460

这久在写一个基于TCP的通信程序,Server端用WinCE实现,而Client端用Qt实现,之前已写了一个VC的Client端,能正确向Server发送数据。

将Client端改用Qt实现后connectToHost()后,server端已能正确accept(),但就是write()后server的read函数无法响应。调试了半天没有成功,火大呀!今天试着输出socket的状态后得到如下:

  1. bool TcpClient::newConnect(const QString &iAddr, quint16 iPort)
  2. {

  3.     mSocket = newQTcpSocket(this);
  4.     mSocket->connectToHost(iAddr,iPort);
  5.     qDebug(“State:%d\n”,mSocket->state());   // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)

  6.     connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
  7.     connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);
  8. }

  9. qint64 TcpClient::write(const QByteArray &iData)
  10. {

  11.     qint64len = mSocket->write(iData);
  12.     qDebug(“State:%d\n”,mSocket->state()); // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)

  13.     msleep(200);
  14.     return(len);
  15. }

复制代码

通过输出状态,已经找到问题的所在,哎!都是业务不熟害的呀!
socket的连接是异步的,所以必须等连接建立完成才能使用,所以分别加入waitForConnected()和waitForBytesWritten()后调试通过。

  1. bool TcpClient::newConnect(const QString &iAddr, quint16 iPort)
  2. {

  3.     mSocket = newQTcpSocket(this);
  4.     mSocket->connectToHost(iAddr, iPort);
  5.     qDebug(“State:%d\n”,mSocket->state());   // State: 2; 2代表ConnectingState,正确的应该为3(ConnectedState)

  6.     constintTimeout=5*1000;
  7.     if(!mSocket->waitForConnected(Timeout))
  8.     {

  9.         return(false);
  10.     }
  11.     qDebug(“State:%d\n”,mSocket>state()); // State: 3(ConnectedState)正确

  12.     connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
  13.     connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);
  14. }

  15. qint64 TcpClient::write(const QByteArray &iData)
  16. {

  17.     qint64len = mSocket->write(iData);
  18.     mSocket->waitForBytesWritten(300);
  19.     qDebug(“State:%d\n”,mSocket->state());  // State: 3(ConnectedState)正确

  20.     msleep(200);
  21.     return(len);
  22. }

QT下用QTcpSocket传输文件, 调用了QTcpSocket:write()但是如何没有bytesWritten信号上来

http://www.myexception.cn/qt/369565.html


[提问]如何正常关闭QTcpsocket?我觉得很难协调好客户端和服务端的关闭操作

有益的讨论:http://www.qtcn.org/bbs/read-htm-tid-26913.html


其它文章:http://www.qtcn.org/bbs/read-htm-tid-56901.html


在构造函数中 new了 一个m_TcpSocket,然后关联了几个信号。

        m_TcpSocket new QTcpSocket(this);
        connect(m_TcpSocket, SIGNAL(readyRead()),this,SLOT(readMessage()));  
    connect(m_TcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),  this,SLOT(displayError(QAbstractSocket::SocketError)));
    connect(m_TcpSocket, SIGNAL(connected()), this, SLOT(onConnect()));
    connect(m_TcpSocket, SIGNAL(disconnected()), this, SLOT(onDisConnect()));

然后在 qpushbutton 连接的槽函数中
         m_TcpSocket->abort();
     m_TcpSocket->connectToHost(StrIP,nPort);

当我关闭tcp连接m_TcpSocket->disconnectFromHost();,然后重新连接时发现内存不断增大。

我想实现的是当服务器连接不上的时候,重新进行连接请求直到连接上为止(断线重连)。
我就定义了timer 重复使用connectToHost函数进行连接直到连上为止。
基本功能我实现了,可是在这重复connectToHost时,内存会不停增大。不管我在connectToHost前添加
        m_TcpSocket->abort();

        m_TcpSocket->close();
    m_TcpSocket->disconnectFromHost();
都没用。有什么办法解决么???


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195743.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月11日 上午11:22
下一篇 2025年10月11日 下午12:01


相关推荐

  • PMP考试心得分享(已通过)

    PMP考试心得分享(已通过)01 前言终于终于等到了你 我的 PMP 通过了 这一路走来不容易啊 我是 2020 年 3 月份报考培训班的 因为家庭以及工作的缘故 拖了整整一年 最终打算在 2021 年 3 月参加培训考试 因为疫情的原因 一直被延考 心态都崩了 几乎每次都是考前的 10 天才通知 可以看出歪果仁的风险管理真的十分 一波三折 还好自己能参加 9 月 25 号 并最终通过了考试 附上我的证书 本文主要分享我的一些考试心得 02 报名前准备在考试前 我是准备得很充分的 当时我只知道这条证是对简历的镀金 对将来转管理

    2026年3月19日
    2
  • UpdatePanel控件的使用(实现局部刷新,ajax)

    UpdatePanel控件的使用(实现局部刷新,ajax)ScriptManager和UpdatePanel控件联合使用可以实现页面异步局部更新的效果。其中的UpdatePanel就是设置页面中异步局部更新区域,它必须依赖于ScriptManager存在,因为ScriptManger控件提供了客户端脚本生成与管理UpdatePanel的功能。几个重要的属性:   ScriptManager控件的EnablePartialRendering属

    2022年7月23日
    12
  • MERGE 函数的使用[通俗易懂]

    MERGE 函数的使用[通俗易懂]1.Merge是什么?

    2022年4月30日
    213
  • 亚信安全发布2021年挖矿病毒专题报告,聚焦挖矿病毒进化与治理

    亚信安全发布2021年挖矿病毒专题报告,聚焦挖矿病毒进化与治理供稿|亚信安全出品|CSDN云计算近日,《亚信安全2021年挖矿病毒专题报告》正式发布(以下简称《报告》)。《报告》以2021年亚信安全威胁情报与服务运营部门所监测、分析和处置的挖矿病毒事件为基础,对各类挖矿病毒和攻击进行分析梳理与情况总结,并且深度探究未来可能会演化的方向,以此帮助更多用户,以更安全、更高效、更全面的行动做出安全规划,为挖矿病毒治理提供了参考路径。2021年挖矿病毒大事件全面回顾2021全年,亚信安全共拦截挖矿病毒516,443次。《报告》基于此整体梳.

    2022年5月20日
    60
  • disqualification游戏_ACWING怎么样

    disqualification游戏_ACWING怎么样如下图所示,有一个 # 形的棋盘,上面有 1,2,3 三种数字各 8 个。给定 8 种操作,分别为图中的 A∼H。这些操作会按照图中字母和箭头所指明的方向,把一条长为 7 的序列循环移动 1 个单位。例如下图最左边的 # 形棋盘执行操作 A 后,会变为下图中间的 # 形棋盘,再执行操作 C 后会变成下图最右边的 # 形棋盘。给定一个初始状态,请使用最少的操作次数,使 # 形棋盘最中间的 8 个格子里的数字相同。输入格式输入包含多组测试用例。每个测试用例占一行,包含 24 个数字,表示将初始棋

    2022年8月8日
    8
  • 云原生分布式数据库PolarDB_polardb数据库

    云原生分布式数据库PolarDB_polardb数据库原生数据库PolarDB和云原生数据仓库AnalyticDB的优势在哪里?李飞飞,现任阿里巴巴集团副总裁、高级研究员,阿里云智能数据库事业部总负责人。美国计算机协会ACM杰出科学家,加入阿里巴巴之前为美国犹他大学计算机系终身教授。研究成果多次获得了IEEEICDE、ACMSIGMOD最佳论文奖等重要学术奖项。他也是中国计算机协会CCF大数据专家委员会副主任、数据库专业委员会常委。————————————————原文链接:https://blog.csdn.net/alitech2017/artic

    2025年11月26日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号