简述

对于一个C/S结构的程序,客户端有些时候需要实时得知与服务器的连接状态。而对于客户端与服务器断开连接的因素很多,现在就目前遇到的情况进行一下总结。

分为下面六种不同情况

客户端网线断开

客户端网络断开

客户端通过HTTP代理连接服务器,代理机器断开代理

客户端通过HTTP代理连接服务器,代理机器的网络断开

客户端通过HTTP代理连接服务器,代理机器的网线断开

服务器断开

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

开始连接服务器之前

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

qtcpsocket断开_QTcpSocket 对连接服务器中断的不同情况进行判定(六种情况,其中一种使用IsNetworkAlive API方法)...相关推荐

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

    简述 对于一个C/S结构的程序,客户端有些时候需要实时得知与服务器的连接状态.而对于客户端与服务器断开连接的因素很多,现在就目前遇到的情况进行一下总结. 分为下面六种不同情况 客户端网线断开 客户端网 ...

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

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

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

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

  4. 腾达宽带连接服务器无响应,腾达(Tenda)无线路由器192.168.0.1打不开问题解决方法图文教程...

    本文介绍了腾达(Tenda)无线路由器192.168.0.1 打不开的解决办法,192.168.0.1是腾达无线路由器的设置网址:在浏览器中无法打开192.168.0.1登录页面,请参考下面的解决办法 ...

  5. pycharm远程连接服务器问题No files or folders found to process一种可能的解决办法

    在用pycharm远程ssh连接服务器同步本地文件时,发现No files or folders found to process报错 核实了一下,明明远程地址.账号密码都没问题,也设置了自动over ...

  6. 【mysql】远程连接服务器数据库出现 Client does not support authentication protocol requested by server的解决方法

    前言 之前已经配好了本地数据库与云服务器上的数据库的连接,也能正常进行操作.几个月后某天打开navicat想打开此连接却弹出了个错误提示窗口,显示Client does not support aut ...

  7. dnf连接服务器黑屏xp系统,DNF地下城与勇士黑屏win10系统电脑解决方法

    地下城与勇士(DNF)喜欢玩的朋友非常多,所以出现问题的朋友也就多了~电脑环境不同出现的问题也不一样,而黑屏问题有很多朋友遇上过,原因不一,下面针对一些黑屏情况分析下Win10系统电脑下解决方法和大家 ...

  8. 虚拟主机网站服务器失去响应怎么办,网站打不开的6种现象及解决方法

    网站打不开的6种现象及解决方法 ★ 出现Bad Request(Invalid Hostname)原因:2003系统的虚拟主机IIS处于停止状态的时候会有这种提示,检查后台主机状态,一般这种情况主机状 ...

  9. 手机怎么断开电脑微信连接服务器,手机连到电脑经常断开怎么办

    随着近些年来IT行业的快速发展,IT技术的逐渐成熟,人们对IT产品的选购要求也由最初的逆来顺受到对个性化的追求.当今时代,几乎人人手上都有一台属于自己的手机.而对于电脑而言,越来越多的人不管工作还是生 ...

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

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

最新文章

  1. DB2日志传送基础知识简介
  2. python3 os_Python3 标准库:os
  3. 软考信息安全工程师学习笔记三(1.3 信息安全管理基础)
  4. Firefox Test Pilot 计划正式关闭
  5. msdb 数据库_如何检索有关存储在MSDB数据库中的SSIS包的信息
  6. java8的stream特性_Java8新特性介绍:Stream API
  7. 拓端tecdat|电力消耗模型构建、分析和预测
  8. 1×1的卷积核在卷积层的作用----网络中的网络
  9. 2022.08 VMware官网下载安装+配置Linux虚拟机,最新最全
  10. 【组合数学】 牡牛和牝牛
  11. 计算机附件常用工具,Windows附件常用工具
  12. 学计算机基础的重要性,论计算机基础的重要性
  13. 题目:P3717 [AHOI2017初中组]cover
  14. emc re 整改 超标_EMC测试及整改办法
  15. spring循环依赖让你更好的理解spring!!
  16. python练习--360搜索关键字采集
  17. dz diy html用户信息,Discuz教程:个人资料设置只显示用户名的解决方法
  18. 谷粒学院笔记-第二天-数据库设计
  19. OpenLayers 加载天地图模糊的问题 OpenLayers 地图缩放模糊
  20. ie 和火狐兼容问题

热门文章

  1. python实现广义线性模型
  2. 【论文笔记】Exploring Self-attention for Image Recognition
  3. 爆款升级当贝NEW D3X来了,画质亮度远超坚果O1S,性能小钢炮实至名归
  4. 光影精灵usb安装linux,惠普光影精灵5笔记本怎么装win10系统(uefi+gpt)
  5. 计算机系统是无形资产吗,计算机操作系统做为无形资产核算吗
  6. Mathematica 矩阵的LU分解
  7. 云台球型摄像机市场深度研究分析报告
  8. 【面试分享】奇安信渗透测试工程师,通过!
  9. LKA linux kernel architechture
  10. mmsi是代表船舶什么_海上移动业务识别码(MMSI)是一种九位识别码,主要分配给()在DSC和NBDP通信中相互识别身份是使用。...