qt网络状态检测使用popen来实现,当然你也可以使用QProcess的start(“cmd /c ping www.baidu.com”)来实现。
本文通过一个在线程中使用QTimer定时器来实现每间隔几秒ping一次网络,实际使用时,一般在post或者get接口访问失败后打开网络监控,网络连上后,关掉定时器来减小开销。
由于cmd /c部分情况下会出现控制台窗口。所以windows下可以使用:
AllocConsole(); //为调用进程分配一个新的控制台
ShowWindow(GetConsoleWindow(), SW_HIDE); //隐藏自己创建的控制台
实例如下:
.h
#include <QObject>
#include <QTimer>
#include <QThread>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <windows.h>
class NetworkCheck : public QObject
{
Q_OBJECT
public:
static NetworkCheck *instance();
void checkNetwork();
QString getCmdResult(const QString &strCmd);
public slots:
void TimeOut();
void slotStart();
signals:
void signalReNetwork();
private:
NetworkCheck(QObject *parent = nullptr);
private:
QTimer* m_timer;
QThread* m_thread;
QByteArray m_recData;
int m_returnCode;
bool m_status = true;
};
.cpp
NetworkCheck::NetworkCheck(QObject *parent)
{
AllocConsole(); //为调用进程分配一个新的控制台
ShowWindow(GetConsoleWindow(), SW_HIDE); //隐藏自己创建的控制台
m_thread = new QThread;
connect(m_thread,SIGNAL(started()),this,SLOT(slotStart()));
m_timer = new QTimer;
connect(m_timer,SIGNAL(timeout()),this,SLOT(TimeOut()));
m_timer->moveToThread(m_thread);
this->moveToThread(m_thread);
}
NetworkCheck* NetworkCheck::instance()
{
static NetworkCheck pInstance;
return &pInstance;
}
void NetworkCheck::slotStart()
{
QString url = "cmd /c ping www.baidu.com";
QString res = getCmdResult(url);
qDebug()<<__FUNCTION__<<__LINE__<<res;
if (res.contains("找不到主机"))
{
if (!m_timer->isActive())
m_timer->start(5000);
m_status = false;
}
else
{
m_timer->stop();
if (!m_status)//网络重连成功
{
m_status = true;
emit signalReNetwork();
}
}
}
/// 执行cmd指令并返回结果
QString NetworkCheck::getCmdResult(const QString &strCmd)
{
char buf[10240] = {0};
FILE *pf = NULL;
if( (pf = _popen(strCmd.toStdString().c_str(), "r")) == NULL )
{
return "";
}
std::string strResult;
while(fgets(buf, sizeof buf, pf))
{
strResult += buf;
}
_pclose(pf);
unsigned int iSize = strResult.size();
if(iSize > 0 && strResult[iSize - 1] == '\n') // linux
{
strResult = strResult.substr(0, iSize - 1);
}
return QString::fromLocal8Bit(strResult.c_str());
}
void NetworkCheck::checkNetwork()
{
m_thread->start();
}
void NetworkCheck::TimeOut()
{
slotStart();
}