首页 > 其他分享 >Qt QTcpSocket 对连接服务器中断的不同情况进行判定

Qt QTcpSocket 对连接服务器中断的不同情况进行判定

时间:2024-03-26 13:56:35浏览次数:28  
标签:HTTP 断开 代理 QTcpSocket 服务器 Qt 连接 客户端

简述

对于一个C/S结构的程序,客户端有些时候需要实时得知与服务器的连接状态。而对于客户端与服务器断开连接的因素很多,现在就目前遇到的情况进行一下总结。
分为下面六种不同情况
  1.     客户端网线断开
  2.     客户端网络断开
  3.     客户端通过HTTP代理连接服务器,代理机器断开代理
  4.     客户端通过HTTP代理连接服务器,代理机器的网络断开
  5.     客户端通过HTTP代理连接服务器,代理机器的网线断开
  6.     服务器断开

同时对于以上六种情况又分为连接服务器之前和连接上服务器之后,下面就分别对不同的情况进行分析。

开始连接服务器之前

    1、 客户端网线断开
    此时用socket调用connectToHost方法连接服务器会立即触发QTcpSocket的error信号,我们可以绑定相应的槽去处理连接失败的结果。
    2、 客户端网络断开
    3、 客户端通过HTTP代理连接服务器,代理机器断开代理
    4、 客户端通过HTTP代理连接服务器,代理机器的网络断开
    5.、客户端通过HTTP代理连接服务器,代理机器的网线断开
    6、 服务器断开
    此时用socket调用connectToHost方法连接服务器并不会立即触发QTcpSocket的error信号,而是经过40s+的连接等待超时发出error信号,见下图。

已经连接上服务器

    1、 客户端网线断开
    此时socket不会发送error信号,也不会发送disconnect信号,查询资料是因为网线断开是属于物理链路层,tcp无法察觉到,socket仍处于连接状态。
    2、 客户端网络断开
    3、 客户端通过HTTP代理连接服务器,代理机器断开代理
    4、 客户端通过HTTP代理连接服务器,代理机器的网络断开
    5.、客户端通过HTTP代理连接服务器,代理机器的网线断开
    第二和第三种情况下会立即触发error信号,而第四和第五种情况下会等待30s左右会发送error信号。
    6、 服务器断开
    此时socket会发送disconnect信号,可以绑定相应的槽去处理服务器断开的情况。

检测与服务器断开的另外方法

对于有些程序(客户端)需要立即知道与服务端连接状态,而不是等待几十秒之后才有信号通知到或者根本就检测不出与服务器断开,除了利用QTcpSocket提供的信号(有几种情况不会发出信号或发出信号延迟),这里列出另外几种处理方法。
1、发送心跳包,即客户端每隔一段时间发送一条报文,报文不需附带具体内容,只需要让服务端知道这是一条心跳报文,并回发一条消息,客户端收到这条消息后就得知与服务器保持连接的状态。
检测本地网络,定义一个时钟,每次timeout去检测本地的网络,关于怎么判断本地网络是否通畅呢?
2、可以用windows提供的IsNetworkAlive方法,返回为false为网络异常。加上头文件为#include “Sensapi.h”。同时需要包含Sensapi.lib。
(通过IsNetworkAlive方法判断本地网络,在客户端已经连接上服务器,并且禁用网络时会立即发送error信号,在error信号绑定的槽中去调用这个方法发现返回值为true,因为这种情况下禁用网络后会立即发送error信号,调用IsNetworkAlive方法时可能立即检测不到网络异常。如果通过断点的方式,在调用IsNetworkAlive时就会返回false)

1     DWORD dwFlag;
2     if (FALSE == IsNetworkAlive(&dwFlag))
3     {
4         qDebug() << "NetWorkError";
5     }

注意:
但是这种方法,在本地存在虚拟机并且虚拟机开启时会失效,因为IsNetworkAlive会检测本地所有的网络,在网线断开后,可能检测到虚拟机网络正常,导致返回ture。
3、如果有自己的服务器就ping服务器(前提服务器不会挂),否则就ping一个相对可靠的IP (比如百度),通过看他ping的结果怎么样.
同时在C++ 实现 ping 功能&& 域名(URL)解析实际 IP地址 这篇博客中用C++实现了 ping的 功能,有兴趣的小伙伴可以看一看,了解一下。

1 QProcess *cmd = new QProcess;
2 cmd->start("ping www.baidu.com");
3 // 等待ping 的结果
4 while (cmd->waitForFinished())
5 {
6     QString result = QString::fromLocal8Bit(cmd->readAll());
7     qDebug() << result;
8 }

1 QHostInfo::lookupHost("www.baidu.com", this, SLOT(lookedUp(QHostInfo)));
2 
3 void lookedUp(QHostInfo &host)
4 {
5      qDebug() << host.addresses().first().toString();
6 }
7 //得到IP 地址 就是在互联网上 如果不能得到 就不行

4、QNetworkConfigurationManager::isOnline()。
当然这个只能检查你是否有网络链接,而不能检测你是否连接到互联网。

对于需要自动重连的客户端可以通过以上方法,在判断出与服务器断开后可以重新连接,或者通过超时定时器进行重连,方法很多,在于尝试。

标签:HTTP,断开,代理,QTcpSocket,服务器,Qt,连接,客户端
From: https://www.cnblogs.com/wuyuan2011woaini/p/18096505

相关文章

  • NLog使用和日志上传指定服务器
    背景之前使用的log4net进行日志的记录,但是找过相关资料之后发现log4net不支持根据指定的配置将不同类的日志写入到不同的文件中为了后续的运维需要需要将日志上传至上层平台的接口,方便后续的日志查看解决问题将日志进行分类存放,防止日志都在同一个文件中,难以针对性的进行日......
  • asp net在View视图下通过javascript访问服务器上的文件
    以通过javascript访问服务器上的文件为例控制器:[HttpPost]publicActionResultCheckFileExists(stringaFile){//检查文件是否存在if(System.IO.File.Exists(aFile))//theFile包括完整的路径和文件{returnContent("文件存在");}else{......
  • SVN服务器备份_svn服务器迁移
    SVN服务器备份_svn服务器迁移发布于2022-11-1115:01:38目录前言1hotcopy备份1.1方法说明1.2手动备份1.3自动备份1.3.1备份脚本1.3.2定时任务1.4还原方法1.4.1VisualSVN还原1.4.2SubVersion还原1.5异常提示2dump......
  • 服务器安装KVM环境并安装虚拟机(centOS7)
    一.安装KVM环境1.检测是否支持KVM        cat/proc/cpuinfo|egrep'vmx|svm'        返回结果中有vmx或svm,说明cpu是支持的2. 关闭SELinux,将/etc/sysconfig/selinux中的 SELinux=enforcing 修改为 SELinux=disabled        vi/etc/s......
  • Qt 检查int某一位数据是否为1
    1#include<QCoreApplication>2#include<QString>34intmain(intargc,char*argv[])5{6QCoreApplicationa(argc,argv);78intnumber=123;//例子中的整数910//将整数转换为16进制字符串11QStringhexString=QString::n......
  • Java服务器开发的日志:日志的作用和使用方法;日志文件的定期归档、清理和滚动策略;ELK(又
    Java服务器开发的日志Java服务器开发,为什么要使用日志?应该怎样使用日志?在Java服务器开发中使用日志是非常关键的一个实践,原因如下:本文所说的“日志”,主要是指程序运行时生成的技术日志;它在Java服务器开发中的作用和使用方法如下:故障诊断:技术日志主要用于记录程序运......
  • 初学可视化PyQt5
    【初学可视化PyQt5系列】第1章PyQt5简介第2章PyQt5新增功能第3章Hellomyfourrotordrone第4章PyQt5主要类第5章PyQt5使用Qt设计器第6章PyQt5信号与插槽第7章PyQt5布局与管理第8章PyQt5基本小部件第9章PyQt5QDialog类第10章PyQt5QMessageBox......
  • 【QT+QGIS跨平台编译】之九十一:【QGIS_Python跨平台编译】—【qgis_python.h生成】
    文章目录一、qgis_python.h介绍二、信息分析三、qgis_python.h生成一、qgis_python.h介绍  qgis_python.h是QGIS(QuantumGIS)软件中的一个头文件,主要用于服务于QGIS_Python库的编译,包含导入、导出宏信息的定义。二、信息分析在qgis\src\python目录,CMakeLis......
  • QtableWidget 表头增加复选框简单实现方法
    1.最近再开发一个批量查询上传的小工具,要增加一个批量选择的复选框,全选或者全不选;QCheckBox*checkBox=newQCheckBox(ui.tableWidget);checkBox->resize(40,24);ui.tableWidget->setCellWidget(0,0,checkBox);checkBox->setStyleSheet("margi......
  • 服务器购买攻略:2024年腾讯云服务器购买详细方法全解析
     随着互联网的不断发展,越来越多的企业或个人需要购买云服务器来支持其业务。作为国内领先的云服务提供商,腾讯云提供了多种购买方式以满足不同用户的需求。本文将为您详细介绍腾讯云服务器的三种购买方式及其优缺点,帮助您选择最适合自己的购买方案。一、活动购买固定机型腾讯......