qt服务器主动断开tcp连接_qtcpsocket 多线程

qt服务器主动断开tcp连接_qtcpsocket 多线程简述对于一个C/S结构的程序,客户端有些时候需要实时得知与服务器的连接状态。而对于客户端与服务器断开连接的因素很多,现在就目前遇到的情况进行一下总结。分为下面六种不同情况客户端网线断开客户端网络断开客户端通过HTTP代理连接服务器,代理机器断开代理客户端通过HTTP代理连接服务器,代理机器的网络断开客户端通过HTTP代理连接服务器,代理机器的网线断开服务器断开同时对于以上六种情况又分为连接服务器之…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

简述

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

分为下面六种不同情况

客户端网线断开

客户端网络断开

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

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

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

服务器断开

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

开始连接服务器之前

1、 客户端网线断开

此时用socket调用connectToHost方法连接服务器会立即触发QTcpSocket的error信号,我们可以绑定相应的槽去处理连接失败的结果。

2、 客户端网络断开

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

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

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

6、 服务器断开

此时用socket调用connectToHost方法连接服务器并不会立即触发QTcpSocket的error信号,而是经过40s+的连接等待超时发出error信号,见下图。

qt服务器主动断开tcp连接_qtcpsocket 多线程

已经连接上服务器

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://javaforall.net/195681.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月12日 下午3:15
下一篇 2025年10月12日 下午3:43


相关推荐

  • matlab函数输出语句,matlab两种输出语句分别是什么

    matlab函数输出语句,matlab两种输出语句分别是什么matlab 两种输出语句分别是什么发布时间 2021 02 2614 21 27 来源 亿速云阅读 79 作者 小新这篇文章主要介绍了 matlab 两种输出语句分别是什么 具有一定借鉴价值 感兴趣的朋友可以参考下 希望大家阅读完这篇文章之后大有收获 下面让小编带着大家一起了解一下 matlab 输出语句有两种 分别是 1 自由格式 语法如 disp 23 454 29 4 2 格式化输出 语法如 f

    2026年3月17日
    3
  • JavaFX横幅类游戏开发 教训 游戏贴图

    JavaFX横幅类游戏开发 教训 游戏贴图

    2022年1月3日
    49
  • linux平台 ora 12154,ORA-12154 TNS 无法解析指定的连接标识符

    linux平台 ora 12154,ORA-12154 TNS 无法解析指定的连接标识符ORA-12154TNS无法解析指定的连接标识符[日期:2011-12-27]来源:Linux社区作者:love_UbuntuORA-12154TNS无法解析指定的连接标识符.今天数据库突然连接时报这个错误,plsql连接不上,应用程序连接不上,但是sql可以连上。到网上找了半天,也改了半天。其实我的listener.ora文件是一直没有动的。网上的人说改了之后重启服务就可以。目…

    2022年7月24日
    13
  • python格式化输出之format用法

    python格式化输出之format用法format用法相对基本格式化输出采用‘%’的方法,format()功能更强大,该函数把字符串当成一个模板,通过传入的参数进行格式化,并且使用大括号‘{}’作为特殊字符代替‘%’使用方法由两种:b

    2022年7月3日
    29
  • dos命令数据库导入sql文件

    dos命令数据库导入sql文件

    2021年7月17日
    112
  • acwing-240. 食物链(并查集+边权值)[通俗易懂]

    acwing-240. 食物链(并查集+边权值)[通俗易懂]动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B 吃 C,C 吃 A。现有 N 个动物,以 1∼N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这 N 个动物所构成的食物链关系进行描述:第一种说法是 1 X Y,表示 X 和 Y 是同类。第二种说法是 2 X Y,表示 X 吃 Y。此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句

    2022年8月10日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号