热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Qt之检测程序是否连外网

背景项目交互中,经常要用到websocket,http与服务器通信,但是网络情况又没法保证,网络可能一会是链接状态,一会是断开状态,所以需要有能力实时去检测网络状态;传统方法,或者




背景

项目交互中,经常要用到websocket,http与服务器通信,但是网络情况又没法保证,网络可能一会是链接状态,一会是断开状态,所以需要有能力实时去检测网络状态;传统方法,或者要求行不高的情况下,大多采取程序中单独去个线程,去定时获取外网是否联通。但在商业项目中,尤其是toc的行业,这种网络检测一定要稳定、靠谱,不然直接会给商品大打折扣。
本项目,刚开始也是采用了传统的方法开个网络检测线程,但后来跟人沟通,这种方法不适合,比如在电脑端,如果10个程序都需要联网呢?难道需要10个app都要开线程去检测嘛。所以,网络检测应该时系统层面链路层的东西。
下面简单介绍下传统检测的两种方法,直接给代码了!


使用QNetworkAccessManager / post

.h

class NetLiveWorker : public QObject
{
Q_OBJECT
public:
explicit NetLiveWorker(QObject *parent = nullptr);
~NetLiveWorker();
Q_INVOKABLE bool getLive(){return m_isLive;}
Q_INVOKABLE bool IsHostOnline(QString strHostName, int nTimeoutmSecOnds= 2000);
bool IsWebOk();
signals:
void sig_netChanged(bool);
public slots:
void onTimeout();
private:
bool m_isLive;
bool m_isFirst;
QNetworkAccessManager *pmanager;
};

.cpp

NetLiveWorker::NetLiveWorker(QObject *parent) : QObject(parent)
{
m_isFirst = true;
m_isLive = false;
pmanager = new QNetworkAccessManager(this);
}
NetLiveWorker::~NetLiveWorker()
{
if(pmanager)
delete pmanager;
pmanager = NULL;
}
bool NetLiveWorker::IsWebOk()
{
//return IsHostOnline("110.242.68.4", 2000);
return IsHostOnline("https://www.baidu.com/", 3000);
}
void NetLiveWorker::onTimeout()
{
bool islive = IsWebOk();
//qDebug()<<"Worker::onTimeout islive =" <}
bool NetLiveWorker::IsHostOnline(QString strHostName, int nTimeoutmSeconds)
{
QNetworkRequest request(strHostName);
request.setRawHeader("Content-Type", "charset='utf-8'");
request.setRawHeader("Content-Type", "application/json");
QEventLoop eventloop;
QTimer timer;
timer.singleShot(nTimeoutmSeconds, &eventloop, SLOT(quit()));
timer.start();
QNetworkReply* reply = pmanager->get(request);
QMetaObject::Connection cOnRet= QObject::connect(reply, SIGNAL(finished()), &eventloop, SLOT(quit()));
Q_ASSERT(conRet);
eventloop.exec(QEventLoop::ExcludeUserInputEvents);
if (!timer.isActive())
{
//超时,未知状态
QObject::disconnect(reply, SIGNAL(finished()), &eventloop, SLOT(quit()));
reply->abort();
reply->deleteLater();
return false;
}
if (reply->error() != QNetworkReply::NoError)
{
//qDebug() <<"error = " <error();
reply->abort();
reply->deleteLater();
return false;
}
bool bRes = reply->readAll().length() > 0;
reply->abort();
reply->deleteLater();
return bRes;
}

使用getlive方法即可拿到当前外网状态。


ping命令实现

.h

class NetworkDetect : public QThread
{
Q_OBJECT
public:
NetworkDetect();
virtual void run();
void stop();
signals:
void sig_netStatusChanged(bool state);
private:
bool flagRunning; //线程运行标志
QProcess *network_process;
};

.cpp

NetworkDetect::NetworkDetect()
{
flagRunning = true;
}
void NetworkDetect::run()
{
QString network_cmd = "ping www.baidu.com -w 500 -n 2";
QString result;
network_process = new QProcess(); //不要加this
while(flagRunning)
{
network_process->start(network_cmd); //调用ping 指令
network_process->waitForFinished(); //等待指令执行完毕
result = network_process->readAll(); //获取指令执行结果
//qDebug() < if(result.contains(QString("TTL=")) || result.contains(QString("ttl="))) //若包含TTL=字符串则认为网络在线
{
emit sig_netStatusChanged(true); //在线
}
else
{
emit sig_netStatusChanged(false); //离线
}
sleep(1); //加sleep降低CPU占用率
}
}
void NetworkDetect::stop()
{
flagRunning = false;
}

不同平台下ping命令的参数不一样,可通过 ping --help来参考


扩展

在某些嵌入式平台下,应该时系统层面通过回调函数来告诉你外网是否联通,有种wifi情况下,即使通知你链接成功了,也未必能通外网,还是需要你通过portalAuth机制来检测下。即拿到网络链路成功后,通过http或者ping方法确实是否能连外网。

Portal认证简介
Portal认证通常也称为Web认证,一般将Portal认证网站称为门户网站。用户上网时,必须在门户网站进行认证,只有认证通过后才可以使用网络资源。

用户可以主动访问已知的Portal认证网站,输入用户名和密码进行认证,这种开始Portal认证的方式称作主动认证。反之,如果用户试图通过HTTP访问其他外网,将被强制访问Portal认证网站,从而开始Portal认证过程,这种方式称作强制认证。

内置portal认证---------指的就是会话认证。
外置Portal认证



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
author-avatar
我叫博小微
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有