目前,在将原来C的socket通讯改为使用Qt类库QTcpSocket通讯,在修改过程中遇到不少问题,在此将问题一并记录,以备后面使用。

采用的通讯方式:QTimer定时器、QThread多线程和QTcpSocket通讯。QTimer设置定时通讯间隔(10s),QThread运行定时器响应函数,QTcpSocket进行数据发送。

1.问题一:QTcpSocket对象创建和使用要在同一个线程,否则报错。

错误描述:QObject:Cannot create children for a parent that is in a different thread.

问题描述:开始是将QTcpSocket对象作为主界面的一个成员变量,因此在构造函数内初始化(new),然后在QThread线程内连接服务端以及进行数据发送。

问题解决:将初始化和连接都放在QThread内,并建立一个长连接,并采用一个标志位表示连接状态,发送前判断连接标志位,以此来进行连接或者发送。

2.问题二:在QThread内将QTcpSocket对象信号(connected、error、stateChangeed)与槽函数连接报数据类型未注册

错误描述:QObject::connect: Cannot queue arguments of type 'QAbstractSocket::SocketError' (Make sure ‘QAbstractSocket::SocketError' is registered using qRegisterMetaType(). )

问题描述:connect自动连接在线程类中的信号默认是排队模式QueuedConnection,因此需要注册参数类型。

问题解决:方法一,将默认connect的连接方式改为Qt::DirectConnection,就不需要类型信息;方法二,在线程内注册qRegisterMetaType参数类型,目前未测试。

3.问题三:调用connectToHost建立连接后调用write发送数据失败

错误描述:QNativeSocketEngine::write() was not called in QAbstractSocket::ConnectedState

问题描述:错误为不是在QTcpSocket连接状态下调用write()函数,即调用write()时连接尚未建立

问题解决:方法一,在调用connectToHost后接着调用waitForConnected(timeout),并给延时参数赋值,之后在调用write()函数;

方法二,在信号connected的槽函数里调用write()函数进行数据发送;

方法三,在信号stateChangeed的槽函数内判断当前QTcpSocket对象连接状态state(),如果是QAbstractSocket::ConnectedState则调用write()函数进行数据发送;

实际是使用一个连接标志位来决定是否调用write()函数发送数据,在信号connected的槽函数里修改标志位为真,每次定时器到期都首先判断标志位,为假则重新尝试建立连接。

4.问题四:服务端没开启和网线没连接错误不一样

错误描述:服务端没开启错误为:QTcpSocket Connection Refused,网线没连接错误为:Network operation timed out

问题描述:服务端没开启返回连接被拒绝,网线没连接则会超时,这个可能和网络情况有关系。。。

问题解决:不清楚具体原因,将上述现象作为一个判断区分两者的方法。

5.问题五:连接关闭

错误描述:直接调用disconnect,错误信息忘记了。。。

问题描述:

问题解决:改为调用disconnectFromHost()函数,这个函数会等待这个连接的相关操作(数据发送)完成后才关闭连接。

6.问题六:保活keepalive

错误描述:不发keepalive包

问题描述:对QTcpSocket.socketDescriptor做keepalive配置,在连接成功前配置无效

问题解决:改为在在connected信号槽函数内配置,然后在disconnected信号槽函数内修改连接标志。这样可以监测到对端异常断开的情况,但是本端网线被拔还是监测不到,这是个遗留问题。

7.问题七:心跳机制

为了确定连接是否正常,考虑使用两种方法:

方法一:使用问题六中的保活keepalive机制,在空闲时候发送空包,接收对端确认信息,从而确认连接是否正常;

方法二:使用心跳机制,本端定时发送心跳包,然后接收对端回复的心跳包,从而确认连接是否正常;或者在本端发送后接收对端回复的确认信息。

两种方法都是通过数据包来确认连接,相比之下方法一配置简单,不需要修改对端代码,但是两端要进行交互;方法二需要修改服务端代码(在数据接收处增加回复确认信息代码),但是相比方法一少了一次本端向对端发送数据包。(这里本端是指客户端,对端指服务端)

QTcpSocket使用过程中的一些问题记录相关推荐

  1. 关于Adams安装过程中问题的解决记录

    关于Adams安装过程中问题的解决记录 问题记录 总结 说明 问题记录 遇到问题的时间:2019.3.12 遇到的问题:在安装Adams 2014的许可服务器时,报错:"service ms ...

  2. linux安装和配置 mysql、redis 过程中遇到的问题记录(转)

    章节目录 mysql redis linux下部署mysql和redis网上的教程很多,这里记录一下我部署.配置的过程中遇到的一些问题和解决办法. mysql ①安装完成后启动的时候报错 Starti ...

  3. idea中push到github或gitee过程中的常见错误记录

    刚用git进行版本控制不久,过程中遇到了很多很多问题,之前一直使用svn,git支持分布式版本管理,在你自己本地上,也会有版本更新的记录.使用svn时,必须要保持网络畅通,所有的版本记录是记录在中央服 ...

  4. VxWorks 最小系统移植到全志 A40i CPU 过程中的 bug 修复记录

    硬件平台:英飞凌 OKA40i 开发板 软件平台:VxWorks 6.6 最小系统所需要的驱动包括: 汇编启动文件, mmu 配置 串口, ARM 内核通用定时器, GIC bug0: 串口打印字符串 ...

  5. Tomcat环境变量配置及安装过程中错误解决方法记录

    Tomcat环境变量配置 安装好tomcat之后, 按照这个操作,计算机→属性→高级系统设置→高级→环境变量,打开环境变量设置框. 以本人的tomcat 8.5.46为例:安装下来如图: 那么我的to ...

  6. 安装KeOps过程中的踩坑记录

    由于需要跑一篇论文的代码,需要安装KeOps.这里忍不住再吐槽一次:Python开发环境的版本依赖管理太混乱了,加上各种操作系统,驱动,CUDA版本等等,太浪费生命.所以,如果要写论文,发布open ...

  7. win10下mediasoup搭建过程中的一些坑记录

    我们原来基于Janus的webrtc系统基本上可用了,系统目前最高到5万人同时在线,不过确实发现Janus的一些不足,对于我这种喜欢c++的人来说,看Janus的代码实在是比较痛苦,于是处于研究目的, ...

  8. Server使用过程中的常用命令记录

    记录在使用unix中的常用命令, 以及各个基础组件的常用命令 Please input in head: k8s中nodeport端口范围修改 vim /etc/kubernetes/manifest ...

  9. python selenium在编写过程中遇到的问题记录

    问题1. 在一个文件夹中没有__init__.py这个文件,那在执行生成测试报告的时候,出现找不到测试用例的情况    __init__.py这个文件是 python中package的标识,它可以什么 ...

最新文章

  1. Numpy、TensorFlow和Keras函数输入参数axis理解
  2. python 科学计算机_在这个免费的虚拟俱乐部中学习计算机科学和Python的基础知识
  3. 安装完SqlServer2008,wamp服务器无法启动的问题
  4. 第一周周报(3月15-3月21)
  5. 基于深度学习的驾驶行为预测方法
  6. matlab已知ft求f2t,基于Matlab的信号与系统实验指导2
  7. 赢在中国 第3讲思维篇
  8. 一个小问题:深度学习模型如何处理大小可变的输入
  9. Thrift框架简介
  10. 做自媒体4大免费网站,帮助我们更快上手运营
  11. 最好用的七大顶级 API 接口测试工具
  12. 电脑注册表修复清理,以及运行库修复
  13. 怎么查看Win7系统无线网络密码
  14. 影响力 读后感 书评
  15. KERNEL_DIR、系统平台、交叉编译器的指定,以及内核模块驱动文件的签名
  16. springboot中 @Imput与@EnableConfigurationProperties区别
  17. 【中秋快乐】如何用three.js实现我的太空遐想3D网页
  18. 谷歌浏览器,查找CSS选择器
  19. 学计算机广告制作用什么电脑,大学设计专业电脑配置须知
  20. 阿迪达斯携手麦当劳推出篮球明星鞋服;拜耳联合导师计划支持中国医药初创企业 | 美通企业日报...

热门文章

  1. 部落冲突,欢迎回归玩家,23级大师联赛部落欢迎你长住
  2. 数据结构(python) —— 【34: 动态规划之钢条切割问题】
  3. 【JAVA长虹键法】第 十二式 外观模式(23种设计模式)
  4. 中山大学生科院骆观正教授课题组诚聘博士后及副研究员
  5. VUE实现前台图片 标注(添加矩形框)、放大、缩小、拖拽
  6. 输出每个数字对应的拼音
  7. oracle 4098,ORA-04098错误解决方法-数据库专栏,ORACLE
  8. 我是歌手黄绮珊(黄妈)彭佳慧,
  9. h5调起app的方法;app调起vue中的某个方法
  10. int定义源码 python_【图片】Python 源码:int【西安网星软件吧】_百度贴吧