QT 检测是否有网络

文章目录

方法一

一、模拟一个请求去判断是否有网,此处需要加个事件循环,实现阻塞等待网络请求的完成。
这是因为Qt的网络模块是基于事件驱动的,网络请求的完成是通过信号和槽机制来通知的。在没有事件循环的情况下,主线程会立即执行到return语句,而此时网络请求可能还没有完成,导致无法获取到正确的网络请求结果。
二、最后在加个定时器,就算没有等到网络请求返回,超时后也会退出事件循环,可以避免网络请求长时间阻塞主线程。

bool checkNetwork(int nTimeout = 3000)
{
	QNetworkAccessManager *netManager = new QNetworkAccessManager();
	QNetworkRequest request(QUrl("https://www.baidu.com"));
	QNetworkReply* reply = netManager->get(request);

	QEventLoop loop;
	QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
	QTimer::singleShot(nTimeout, &loop, SLOT(quit()));
	loop.exec(QEventLoop::ExcludeUserInputEvents);

	return reply->error() == QNetworkReply::NoError;
}

tips:通过请求网络接口来检测网络,会有个问题是内网的话,百度网址就请求不到了。

方法二

一、通过特定的网卡判断是否有网
通过以太网和WIFI去判断是否有网,以太网还需要指定特殊的名称,因为一个电脑下,会有多个以太网网卡。一般是以"e"开头命名的。

bool checkNetwork()
{
	bool bConnected = false;
	QList<QNetworkInterface> ifaces = QNetworkInterface::allInterfaces();
	for (int i = 0; i < ifaces.count(); i++)
	{
		QNetworkInterface networkInterface = ifaces.at(i);
		if (networkInterface.type() ==  QNetworkInterface::Ethernet && networkInterface.name().startsWith("e"))
		{
			if (networkInterface.flags().testFlag(QNetworkInterface::IsUp) &&
				networkInterface.flags().testFlag(QNetworkInterface::IsRunning))
			{
				bConnected = true;
			}
		}

		if (networkInterface.type() == QNetworkInterface::Wifi)
		{
			if (networkInterface.flags().testFlag(QNetworkInterface::IsUp) &&
				networkInterface.flags().testFlag(QNetworkInterface::IsRunning))
			{
				bConnected = true;
			}
		}
	}
	return bConnected;
}
  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值