Qt 判断网络连接

QProcess*cmd=new QProcess;

cmd->start("ping www.baidu.com");// 等待ping 的结果

while (cmd->waitForFinished())

{

QString result= QString::fromLocal8Bit(cmd->readAll());

qDebug()<< result;

}


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;
}
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

QHostInfo::lookupHost("www.baidu.com", this, SLOT(lookedUp(QHostInfo)));

void lookedUp(QHostInfo &host)
{
     qDebug() << host.addresses().first().toString();
}
//得到IP 地址 就是在互联网上 如果不能得到 就不行
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4、QNetworkConfigurationManager::isOnline()。 
当然这个只能检查你是否有网络链接,而不能检测你是否连接到互联网。


前言

在Qt中判断网络是否连接有两种方式,其中一种是网络连接但是不一定能上网,可能只是连接了网线或者Wi-Fi,但不一定能够上互联网。另一种判断该网络是否可以连接互联网,两种情况的判别方式有所区别。

正文

第一种:只需要判断网络是否有连接,不一定能上网

这个很简单,直接通过Qt的类QNetworkConfigurationManager自带的函数就可以判断(该方法也适用于Android平台):

bool CommonParameter::isNetWorkOnline()
{
    QNetworkConfigurationManager mgr;
    return mgr.isOnline();
}
 
  • 1
  • 2
  • 3
  • 4
  • 5

第二种:判断是否能上网

这种方式是检查是否连接互联网,原理:通过访问指定的网站,如果能访问成功表示已正常连接。

void CommonParameter::checkNetWorkOnline()
{
    QHostInfo::lookupHost("www.baidu.com",this,SLOT(onLookupHost(QHostInfo)));
}

void CommonParameter::onLookupHost(QHostInfo host)
{
    if (host.error() != QHostInfo::NoError) {
        qDebug() << "Lookup failed:" << host.errorString();
        //网络未连接,发送信号通知
        emit sigLookUpHostResult(false);
    }
    else{
        emit sigLookUpHostResult(true);
    }
}

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

通过静态函数QHostInfo::lookupHost访问指定网络后会将结果返回到槽里面,然后再将结果发送信号出去。

监测网络变化

第一种方法可以获取到当前网络状态,但是如果要实时监测到网络变化,可以通过QNetworkConfigurationManager中的信号来获取,如下

void onlineStateChanged(bool isOnline)
 
  • 1

官方说明:This signal is emitted when the device changes from online to offline mode or vice versa. isOnline represents the new state of the device. 
The state is considered to be online for as long as allConfigurations(QNetworkConfiguration::Active) returns a list with at least one entry. 
所以,可以通过连接这个信号来实现网络监测,亲测可用。


Qt中,我们可以利用信号(Signal)和槽(Slot)机制来检测网络连接状态。当你需要在应用程序中实时监控网络连接时,可以创建一个与QNetworkAccessManager相关的信号,例如`qNetworkReplyFinished()`,这个信号会在网络请求完成时发送。 首先,在你的类中声明一个信号,比如: ```cpp public slots: void networkConnectionChanged(QNetworkReply::NetworkError error); ``` 然后,当网络请求的网络错误发生时(如`QNetworkReply::OperationCanceledError`表示断开),调用这个槽函数并设置相应的网络连接状态: ```cpp private slots: void handleNetworkRequestFinished(QNetworkReply* reply) { if (reply->error() != QNetworkReply::NoError) { networkConnectionChanged(reply->error()); } } void networkConnectionChanged(QNetworkReply::NetworkError error) { switch (error) { case QNetworkReply::NoError: qDebug() << "Connected to the internet"; // 设置网络状态为已连接 break; case QNetworkReply::HostNotFoundError: qDebug() << "Cannot find host"; // 设置网络状态为无响应或无法找到主机 break; // 其他错误处理... } } ``` 最后,在适当的地方启动网络请求,并链接到信号处理函数: ```cpp QNetworkReply *reply = manager.get(QNetworkRequest(url)); connect(reply, &QNetworkReply::finished, this, &YourClass::handleNetworkRequestFinished); ``` 通过这种方式,当网络连接发生变化时,你的槽函数会被自动调用,你可以根据实际需求更新UI或者执行其他操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值