这里通过ping百度的网址进行判断是否连接外网
使用ping的命令:
ping www.baidu.com -n 2 -w 1000
其中-n 表示要发送的请求数,-w 表示等待每次回复的超时时间(毫秒)
用法:
bool checkPublicNet()
{
QString networkCmd = "ping www.baidu.com -n 2 -w 500";
QProcess process;
process.start(networkCmd);
process.waitForFinished();
QString result = process.readAll();
if(result.contains("TTL=")){
return true;
}
else{
return false;
}
}
ping通返回会包含“TTL”,这个用法会阻塞主线程,如果要用非阻塞的方式需放在线程中执行
qt的线程有多种方式实现,下面使用QtConcurrent搭配QFuture实现
QFuture<bool> checkLocalNet()
{
QString networkCmd = QString("ping www.baidu.com -n 2 -w 1000");
auto check = [=]{
QProcess process;
process.start(networkCmd);
process.waitForFinished();
QString result = process.readAll();
if(result.contains("TTL=")){
return true;
}
else{
return false;
}
};
//放在线程中,防止界面卡住
QFuture<bool> future= QtConcurrent::run(check);
return future;
}
运用:
QFuture<bool> future = checkLocalNet();
QFutureWatcher<void> *watcher = new QFutureWatcher<void>(this);
connect(watcher, &QFutureWatcher<void>::finished,[=]{
if(future.result()){
...
}
});
watcher->setFuture(future);
省略号后是要实现的内容