简述

对于一个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)

    DWORD dwFlag;if (FALSE == IsNetworkAlive(&dwFlag)){qDebug() << "NetWorkError";}

注意:

但是这种方法,在本地存在虚拟机并且虚拟机开启时会失效,因为IsNetworkAlive会检测本地所有的网络,在网线断开后,可能检测到虚拟机网络正常,导致返回ture。

3、如果有自己的服务器就ping服务器(前提服务器不会挂),否则就ping一个相对可靠的IP (比如百度),通过看他ping的结果怎么样. 
同时在C++ 实现 ping 功能&& 域名(URL)解析实际 IP地址 这篇博客中用C++实现了 ping的 功能,有兴趣的小伙伴可以看一看,了解一下。

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

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

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


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

转自:http://blog.csdn.net/GoForwardToStep/article/details/52300335?locationNum=4

转载于:https://www.cnblogs.com/liushui-sky/p/6473539.html

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

  1. 元神一直显示连接服务器失败,原神连接服务器失败是什么情况-提示连接服务器失败处理办法-去秀手游网...

    原神连接服务器失败是什么情况?想必很多小伙伴都知道游戏近期连接服务器失败,玩游戏的时候有弹窗提示这几个字,接下来去秀小编就给大家带来了原神提示连接服务器失败处理办法,希望能帮助到大家,一起来看看吧. ...

  2. 泡泡堂msn服务器中断,玩泡泡堂的时候为什么老是出现连接服务器中断 – 手机爱问...

    2006-07-31 玩泡泡堂时服务器经常中断该怎么办 问题:玩泡泡堂时服务器经常中断该怎么办每次打开泡泡堂游戏,玩了不一会就出现服务器中断,请问遇到这种情况我该怎样去解决.让它不再中断.还有玩时屏幕 ...

  3. 劲舞团连接服务器中断,劲舞团与服务器中断连接的解决办法有哪些?

    劲舞团是众多玩家们都非常喜欢休闲娱乐游戏,所能够带来的体验多多,不少玩家们在享受劲舞团的时候会遇到不少问题,比如劲舞团与服务器中断连接就是典型代表.为什么在玩劲舞团的时候会出现与服务器中断,解决的主要 ...

  4. 永恒之塔为什么连接服务器中断,win7系统下永恒之塔无法连接到认证服务器如何解决...

    近日有win7纯净版32位系统用户在玩永恒之塔游戏的时候,遇到提示无法连接到认证服务器,导致无法继续玩该游戏,要怎么办呢,本教程就给大家讲解一下win7系统下永恒之塔无法连接到认证服务器的具体解决步骤 ...

  5. t3系统总显示得不到服务器,用友T3不能连接服务器你好,用友T3总是说连接不到服务...

    近日使用的用友T3财务软件的T3中碰到一个问题: T3不能连接服务器 详细的问题情况是这样的: 你好,T3总是说连接不到服务器.是怎么回事 注意:本文中提供的方案可以尝试进行操作,如果解决不了您的问题 ...

  6. 劲舞团进不去显示与服务器中断链接,劲舞团进不去显示与服务器中断链接

    劲舞团是一种跟着音乐,然后进行操作舞步,这样能够彰显出最美妙的姿态,游戏逐渐地也变成了生活中的一种形式,但是有时候会遇到劲舞团进不去显示与服务器中断链接,这时候玩家可以采取正确的方式来进行,这样对玩家 ...

  7. 苹果手机查找显示无法连接服务器是怎么回事,iphone手机无法连接服务器怎么办?贝锐网站建站有哪些特点?...

    苹果手机是一个安全系比较高的设备,在使用的时候都有独立的账号,最近有小伙伴抱怨说,自己在登陆Apple ID账号或者注销时,遇到验证失败.无法连接服务器这是什么情况?好解决吗?小编整理了关于iphon ...

  8. qt客户端连接服务器不响应,qt判断tcp客户端是否连接服务器

    qt判断tcp客户端是否连接服务器 内容精选 换一换 本章节指导您使用MongoDB客户端,通过弹性云服务器内网方式连接GaussDB(for Mongo)集群实例.操作系统使用场景:弹性云服务器的操 ...

  9. [Qt] TCP客户端与服务器断开连接自动重联机制

    TCP服务器断开连接自动重联机制 客户端加入定时器实现断线重联(客户端服务端代码见上一篇博客) 编译环境:Qt 5.9.5 ui界面如图: 代码如下 tcpclient.h #ifndef TCPCL ...

最新文章

  1. 四字节对齐(DWORD-aligned)
  2. java中this.value_java中关键字this的用法
  3. Java static initialization研究
  4. 年月跨度_建筑结构丨国内跨度最大的张弦桁架工程——合肥滨湖国际会展中心二期首榀桁架滑移成功...
  5. 《ETL原理及应用》学习笔记 ·002【需求和数据建模】
  6. 为什么要用SpringCloud alibaba作为微服务开发框架?
  7. 安防无战事:一场 10213 亿元的误会
  8. Java NIO类库Selector机制解析(上)
  9. Appium下载安装与配置
  10. 帆软报表FineReport中数据连接的JDBC连接池属性问题
  11. SPU和SKU有什么区别
  12. 一步一回头撞在了南墙上
  13. select函数用法详解
  14. 关于flask-sqlalchemy同字段多条件的过滤方法
  15. markdown设置字体颜色、大小、背景
  16. 设计Date类,该类采用3个整型存储日期: month、 data和year。其函数成员具有按如下格式输出日期的功能(异常处理)
  17. ls一1测距仪说明书_生产力小工具 篇一:激光测距靠谱吗?杜克LS-1激光测距仪开箱测评...
  18. [MRCTF2020]PYWebsite -wp
  19. 基于R语言SVD的图像压缩方法
  20. freemodbus多从机支持

热门文章

  1. 数据分析Python:sklearn数据预处理中fit(),transform()与fit_transform()的区别
  2. myeclipse maven 报错javax.servlet.http.HttpServlet的解决方法
  3. linux修改网卡文件夹,CentOS7 修改网卡名称为eth0在VMWare中添加多网卡配置
  4. 电脑鼠标自己乱跳乱点_无线鼠标VS有线鼠标,二者区别何在?你可知晓?不妨来了解一下...
  5. Linux下内存泄露工具
  6. CSS转义字符对照表
  7. libinjection开源库的研究总结
  8. 图的存储以及深度优先以及广度优先遍历
  9. 人工神经网络之激活函数 -RELU函数
  10. Android自己搭建一个实用的SharedPreferences管理类