关于使用QTcpSocket的一些总结

2023-11-12

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可以实现自动重连接等逻辑。(注意:如果一个线程有多个连接的话,由于QTimer是中断当前线程的事件消息,故会影响其他连接,且重连接费时,故不太适用)

QTcpSocket调试经验分享

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

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

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

connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);

}

qint64 TcpClient::write(const QByteArray &iData) 

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

msleep(200);
return(len);


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

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

constintTimeout=5*1000;
if(!mSocket->waitForConnected(Timeout))
{
    return(false);
}
qDebug("State:%d\n",mSocket>state()); // State: 3(ConnectedState)正确

connect(mSocket,SIGNAL(readyRead()),this,SLOT(read()));
connect(mSocket,SIGNAL(disconnected()),this,SLOT(disConnect()));return(true);

}

qint64 TcpClient::write(const QByteArray &iData) 

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

msleep(200);
return(len);

}

 

转自:http://blog.csdn.net/u011125673/article/details/50474491

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于使用QTcpSocket的一些总结 的相关文章

  • sprintf, snprintf, _snprintf, sprintf_s 等的区别

    先放结论 1 在支持snpritf的编译器 只使用int snprintf char buffer size t count const char format argument 无论成功或者失败 都会返回字符串的总长度 不包括结束符 如果
  • 计算机网络之网络层

    网络层涉及的问题 1一般是网关 18 是外网 内网有两类 1 存储转发包交换 2 提供给传输层的服务 3 非连接服务的实现 4 面向连接服务的实现 5 虚电路和数据包的比较 OSPF开放式最短路径优先 自治域 cisco路由器 4种延迟 传
  • 批量修改文件夹名称——规则重命名(Excel+Python脚本两种方式)

    批量修改文件夹名称 场景 在进行神经网络训练的时候 有些时候获取到的数据集的命名是不规则的 不便于直观理解数据的结构 由此需要进行批量重命名 本文提供Excel Python脚本两种方式 Excel 如下图所示 文件是命名是乱序无规则的 在
  • QT信号槽跨线程传递QDataStream问题

    第一点 查看QDataStream类 可以发现这一句 Q DISABLE COPY QDataStream Q DISABLE COPY是QT的一个宏 顾名思义 意思为禁用拷贝构造函数 如果要知道这个宏的实现 可以继续F2 所以第一个结论

随机推荐

  • Android 全局异常处理之UncaughtExceptionHandler

    在日常开发中可能有需要将机器奔溃日志保存本机 以便保存到本地 那么该如何做呢 实现UncaughtExceptionHandler接口 public class ApplicationCrashHandler implements Thre
  • upload-labs 环境搭建(docker)

    1 切换到root用户 2 在docker镜像仓库搜索upload labs镜像 3 下载镜像 4 查看本地镜像库 看是否下载成功 如下图就有了下载的镜像 5 运行镜像 生成镜像 docker run d p92 80 镜像id 92端口是
  • Linux学习笔记一:vmware安装Ubuntu虚拟机并进行联网设置

    目录 概述 新建虚拟机 安装Ubuntu 安装后重启失败 联网设置 修改分辨率 概述 主要参考讯为的教程 没有使用讯为提供的镜像 为了自己动手把相关工具安装一遍 采用了官方的Ubuntu18镜像 过程中与教程难免存在差异 遇到问题再针对解决
  • 总结:Git 撤销操作

    1 还未添加到暂存区 git checkout filename 执行命令后 会回退到未修改之前的状态 2 已经添加到暂存区 git reset HEAD filename 执行命令后 会回退到工作区之前的状态 3 已经 commit 但是
  • 以太坊Python智能合约开发指南

    在以太坊上获得一个基本的智能合约是一个很简单的事 只需google查询 ERC20代币教程 你会发现有关如何做到这一点的大量信息 以编程方式与合约交互完全是另一回事 如果你是一个Python程序员 那么教程就很少 所以写这个Python中的
  • Adaptive让 Spark SQL 更高效更智能

    本文转发自技术世界 原文链接 http www jasongj com spark adaptive execution 1 背景 前面 Spark SQL Catalyst 内部原理 与 RBO 与 Spark SQL 性能优化再进一步
  • 期权套期保值

    同种商品期货价格走势与现货价格走势方向基本一致 同涨同跌 而在临近到期日时 期货价格相对现货价格通常会呈现回归 在此基础上 再根据方向相反 数量 相等 月份相同或相近的操作原则进行交易 套期保值的意义 投资者进行套期保值的最终目的是规避或者
  • 浏览器可直接访问 Dubbo、gRPC 后端微服务,Dubbo-js 首个alpha 版本来了!

    基于 Dubbo3 定义的 Triple 协议 你可以轻松编写浏览器 gRPC 兼容的 RPC 服务 并让这些服务同时运行在 HTTP 1 和 HTTP 2 上 Dubbo TypeScript SDK 1 支持使用 IDL 或编程语言特有
  • 华为OD机试真题-信号发射和接收【2023Q2】【JAVA、Python、C++】

    题目描述 有一个二维的天线矩阵 每根天线可以向其他天线发射信号也能接收其他天线的信号 为了简化起见 我们约定每根天线只能向东和向南发射信号 换言之 每根天线只能接收东向或南向发送的信号 每根天线有自己的高度anth 各根天线的高度存储在一个
  • k8s资源类型详解

    k8s资源类型 一 k8s资源类型简介 二 deployment资源类型 三 service资源类型 四 k8s资源的回滚操作 五 用label控制pod的位置 六 namespace简介 七 pod资源类型 八 健康检测的相关应用 九 R
  • 网络爬虫是什么

    作为一家大数据公司的运营小编 经常会有人问我 诶 你说的爬虫是什么呀 爬虫的用途是什么呀 你们公司是卖爬虫的吗 有蜥蜴吗 等一系列问题 面对这些问题 小编是绝望的 那么爬虫到底是什么呢 一 爬虫是什么 以下是百度百科上对于网络爬虫的定义 网
  • Qt内存泄露(总结)

    一 简介 Qt内存管理机制 Qt 在内部能够维护对象的层次结构 对于可视元素 这种层次结构就是子组件与父组件的关系 对于非可视元素 则是一个对象与另一个对象的从属关系 在 Qt 中 在 Qt 中 删除父对象会将其子对象一起删除 C 中del
  • RColorBrewer

    1 RColorBrewer工具包 该包是R中常用的颜色选取工具包 它具有简单易用的特点 对于不具备太多色彩理论的读者来说也十分友好 虽然该包主要是为地图上色而设计 但也可以用于其他用途 library RColorBrewer 下面就逐一
  • 宝来车联网显示服务器开小差,思域请靠边站,比亚迪秦Pro在此!还有导航路况信息显示、车联网 快来瞧瞧!...

    由于各地政策的不同 燃油车和新能源车在各地的发展情况也有所不同 接下来要讲得两辆汽油车还不错 分别是秦Pro和宝来 让我们来一起了解一下吧 车型 比亚迪秦Pro 2018款 1 5TI 自动智联锋尚型 国V 指导价 9 98万元 2020
  • 统计二叉树结点个数(C语言)

    函数接口定义 int NodeCount BiTree T T是二叉树树根指针 函数NodeCount返回二叉树中结点个数 若树为空 返回0 裁判测试程序样例 include
  • matlab双因素模型,matlab双因素方差分析

    在MATLAB中求解 源程序 a 76 67 81 56 51 82 69 96 59 70 68 59 上页 下页 返回 表4 9 双因素试验的方差分析表 方差来源 平方和 自由度 因素 方差分析用于两个或者两个以上因素样本均值的检验问
  • 【行为识别】TSN/TRN/TSM/SlowFast/Non-local

    前言 记录视频理解领域的几篇文章吧 由于每篇值得记录的东西不多 所以合在一起 关于开源框架 有港中文多媒体实验室的MMAction 有设备的就尽量多跑跑模型吧 视频相对于静态图像多了时间维度 静态图像的分类 检测 分割做得相对完善了 视频方
  • 2015中国数据库技术大会简介

    作为国内数据库与大数据领域最大规模的技术盛宴 2015第六届中国数据库技术大会 DTCC 即将于2015年4月16日 18日在北京新云南皇冠假日酒店震撼登场 大会以 大数据技术交流和价值发现 为主题 云集了国内外顶尖专家 共同探讨MySQL
  • Vue项目打包部署到Tomcat

    废话不多说 直接进入正题 一 通常在开发环境下请求后台接口会用到反向代理 而在生产环境中反向代理是不生效的 那么为了避免部署在服务器上时需要一个一个更改接口地址这种麻烦费时的操作 更改配置文件去自动切换接口地址 开发环境 在config文件
  • 关于使用QTcpSocket的一些总结

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