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


相关推荐

  • IIS服务器的配置

    IIS服务器的配置IIS 是一种 Web 网页 服务组件 其中包括 Web 服务器 FTP 服务器 NNTP 服务器和 SMTP 服务器 分别用于网页浏览 文件传输 新闻服务和邮件发送等方面 它使得在网络 包括互联网和局域网 上发布信息成了一件很容易的事 我们可以搭建一个小型的 web 服务器 让我们的电脑成为服务器 通过浏览器可以访问到我们的网页 局域网中 要想外网访问 需要申请域名 解析等 以后在研究 步骤如下 1 找到控制

    2026年3月26日
    1
  • [AI學堂] Manus AI實測🔥 免費AI Agent竟然做到PPT+網站?對比Perplexity Labs效果超驚喜!

    [AI學堂] Manus AI實測🔥 免費AI Agent竟然做到PPT+網站?對比Perplexity Labs效果超驚喜!

    2026年3月15日
    1
  • java教程 电子书_java教程合集(25本)「建议收藏」

    java教程合集25本,pc6帮您一一整理的,这样的入门级java教程应该不会给你带来太大的困惑,起码我没有。相关软件软件大小版本说明下载地址java教程合集(25本),pc6帮您一一整理的,这样的入门级java教程应该不会给你带来太大的困惑,起码我没有。由一个简单的程序谈起――之五(精华).pdf由一个简单的程序谈起――之三(精华).pdf由一个简单的程序谈起――之六(精华).pdf由一个简单的…

    2022年4月18日
    145
  • git clone几种可选参数的使用与区别[通俗易懂]

    git clone几种可选参数的使用与区别[通俗易懂]背景githubclone代码的速度,依赖于代码库的大小以及clone速度,基本是几十kb到200kb之间。要是能达到400kb,恭喜你;要是只有十几kb,emmmm,还是先去吃饭吧。这里以MOOC为例说明在clone某个git仓库时候需要注意的几个问题。全克隆单一克隆深度克隆全克隆很好理解,gitclonegit_仓库_url。存在一个问题,当clone…

    2022年7月21日
    33
  • PoolBoy

    PoolBoy

    2022年1月11日
    92
  • junit测试类的编写

    junit测试类的编写junit 测试类可以直接通过 eclipse 自带功能来编写框架我们设置文件 class 名为 checktestecl 为我们自动生成下列形式的文件我们只需要修改 test 中的内容即可 importstatic junit Assert importorg junit Test publicclassT

    2026年3月16日
    2

发表回复

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

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