方法一
一、模拟一个请求去判断是否有网,此处需要加个事件循环,实现阻塞等待网络请求的完成。
这是因为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;
}