How to check whether the computer connects the internet?
-
I use a method to solve this problem.This is my code:
bool MainWindow::check() { QTcpSocket* sock = new QTcpSocket(this); sock->connectToHost("www.google.com", 80); bool connected = sock->waitForConnected(30000);//ms if (!connected) { sock->abort(); return false; } sock->close(); return true; }
-
It is really no good idea to ping google for detecting a working internet connection.
Your customers will have to verify that they are not a bot on every google search afterwards.I have done this depending on the platform in native code:
Windows:
bool ReachabilityCheck::internetAvailable() { bool result = true; DWORD lpresult; BOOL winresult = InternetGetConnectedState(&lpresult,0); result = winresult == 1 ? true : false; return result; }
macOS:
bool ReachabilityCheck::internetAvailable() { struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress); if (reachability != NULL) { //NetworkStatus retVal = NotReachable; SCNetworkReachabilityFlags flags; if (SCNetworkReachabilityGetFlags(reachability, &flags)) { if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) { // If target host is not reachable return NO; } if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) { // If target host is reachable and no connection is required // then we'll assume (for now) that your on Wi-Fi return YES; } if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) { // ... and the connection is on-demand (or on-traffic) if the // calling application is using the CFSocketStream or higher APIs. if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) { // ... and no [user] intervention is needed return YES; } } // if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) // { // // ... but WWAN connections are OK if the calling application // // is using the CFNetwork (CFSocketStream?) APIs. // return YES; // } } } return NO; // return result; }
-
It is really no good idea to ping google for detecting a working internet connection.
Your customers will have to verify that they are not a bot on every google search afterwards.I have done this depending on the platform in native code:
Windows:
bool ReachabilityCheck::internetAvailable() { bool result = true; DWORD lpresult; BOOL winresult = InternetGetConnectedState(&lpresult,0); result = winresult == 1 ? true : false; return result; }
macOS:
bool ReachabilityCheck::internetAvailable() { struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress); if (reachability != NULL) { //NetworkStatus retVal = NotReachable; SCNetworkReachabilityFlags flags; if (SCNetworkReachabilityGetFlags(reachability, &flags)) { if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) { // If target host is not reachable return NO; } if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) { // If target host is reachable and no connection is required // then we'll assume (for now) that your on Wi-Fi return YES; } if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) { // ... and the connection is on-demand (or on-traffic) if the // calling application is using the CFSocketStream or higher APIs. if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) { // ... and no [user] intervention is needed return YES; } } // if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) // { // // ... but WWAN connections are OK if the calling application // // is using the CFNetwork (CFSocketStream?) APIs. // return YES; // } } } return NO; // return result; }
@euchkatzl said in How to check whether the computer connects the internet?:
It is really no good idea to ping google for detecting a working internet connection.
Your customers will have to verify that they are not a bot on every google search afterwards.Besides that, it will also not work in some countries where google is blocked.
-
It is really no good idea to ping google for detecting a working internet connection.
Your customers will have to verify that they are not a bot on every google search afterwards.I have done this depending on the platform in native code:
Windows:
bool ReachabilityCheck::internetAvailable() { bool result = true; DWORD lpresult; BOOL winresult = InternetGetConnectedState(&lpresult,0); result = winresult == 1 ? true : false; return result; }
macOS:
bool ReachabilityCheck::internetAvailable() { struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress); if (reachability != NULL) { //NetworkStatus retVal = NotReachable; SCNetworkReachabilityFlags flags; if (SCNetworkReachabilityGetFlags(reachability, &flags)) { if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) { // If target host is not reachable return NO; } if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) { // If target host is reachable and no connection is required // then we'll assume (for now) that your on Wi-Fi return YES; } if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) { // ... and the connection is on-demand (or on-traffic) if the // calling application is using the CFSocketStream or higher APIs. if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) { // ... and no [user] intervention is needed return YES; } } // if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) // { // // ... but WWAN connections are OK if the calling application // // is using the CFNetwork (CFSocketStream?) APIs. // return YES; // } } } return NO; // return result; }
-
It is really no good idea to ping google for detecting a working internet connection.
Your customers will have to verify that they are not a bot on every google search afterwards.I have done this depending on the platform in native code:
Windows:
bool ReachabilityCheck::internetAvailable() { bool result = true; DWORD lpresult; BOOL winresult = InternetGetConnectedState(&lpresult,0); result = winresult == 1 ? true : false; return result; }
macOS:
bool ReachabilityCheck::internetAvailable() { struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress); if (reachability != NULL) { //NetworkStatus retVal = NotReachable; SCNetworkReachabilityFlags flags; if (SCNetworkReachabilityGetFlags(reachability, &flags)) { if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) { // If target host is not reachable return NO; } if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) { // If target host is reachable and no connection is required // then we'll assume (for now) that your on Wi-Fi return YES; } if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) { // ... and the connection is on-demand (or on-traffic) if the // calling application is using the CFSocketStream or higher APIs. if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) { // ... and no [user] intervention is needed return YES; } } // if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) // { // // ... but WWAN connections are OK if the calling application // // is using the CFNetwork (CFSocketStream?) APIs. // return YES; // } } } return NO; // return result; }
@euchkatzl
Will the macOS code work on linux?? I don't have linux installed to test it yet -
@euchkatzl
Will the macOS code work on linux?? I don't have linux installed to test it yet@hbatalha said in How to check whether the computer connects the internet?:
@euchkatzl
Will the macOS code work on linux?? I don't have linux installed to test it yetNo,
SCNetworkReachabilityRef
is only available on macOS. -
Hello everybody,
Could somebody give me some advice?
I want to check whether the computer connects to the internet. And I find some answer on the internet. But they don't work well.
-
Use QNetworkConfigurationManager::isOnline(). It doesn't work. Sometimes it returns true even if I disconnect the internet and doesn't receive any onlineStateChanged signal(on windows system). And sometimes it returns true even though I disconnect the internet and can receive some onlineStateChanged signal, and it often receive a disconnect signal before receive an online signal(on ubuntu system). So I think it doesn't work.
-
Use QHostInfo::lookupHost(). It works! But if I disconnect the internet it returns online for several minutes, and if I connect the internet it returns online immediately. And if I use command (dig) on the terminal, it returns disconnect immediately after I disconnect the internet.
Do I make some mistake?
Could somebody give me some other solutions?
I just want to check the internet state as soon as possible.
Thank you in advance!
if you want to check your computer is connected with the internet or not
Then Try this ::
QNetworkAccessManager nam; QNetworkRequest req(QUrl("http://www.google.com")); QNetworkReply* reply = nam.get(req); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); if (reply->bytesAvailable()) { /// You are Connected With The Internet } else { /// You Are Not Connected With The Internet }
-
-
@hbatalha said in How to check whether the computer connects the internet?:
@euchkatzl
Will the macOS code work on linux?? I don't have linux installed to test it yetNo,
SCNetworkReachabilityRef
is only available on macOS.@sierdzio thanks, do you know the linux version of that code?
@Ketan__Patel__0011 read @euchkatzl 's answer above
-
@sierdzio thanks, do you know the linux version of that code?
@Ketan__Patel__0011 read @euchkatzl 's answer above
Same Code Working with in All Platforms
-
I haven't found anything reliable so far that could cover desktop and mobile device. I have a custom web server (hope for a good uptime) that I monitor, can also make a fallback and check 2 different server when both don't answer, you can suppose the internet connection is off. Better to check you own server you want to talk too. The server might be down but not the internet.
I wish I could avoid timeout request when no internet connection is present, the OS is aware of that, just need a way to get the information that is cross platform (that will be so useful). If anybody have an implementation that cover multiple platofrm (the Windows and Mac OS above are a good start, wonder if the Mac OS one work into iOS. WOuld still need Linux and Android to cover the most popular one at least.
-
if you want to check your computer is connected with the internet or not
Then Try this ::
QNetworkAccessManager nam; QNetworkRequest req(QUrl("http://www.google.com")); QNetworkReply* reply = nam.get(req); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); if (reply->bytesAvailable()) { /// You are Connected With The Internet } else { /// You Are Not Connected With The Internet }
@Ketan__Patel__0011 said in How to check whether the computer connects the internet?:
@Qingshui-Kong
if you want to check your computer is connected with the internet or not
Then Try this ::
QNetworkAccessManager nam;
QNetworkRequest req(QUrl("http://www.google.com"));
QNetworkReply* reply = nam.get(req);
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();if (reply->bytesAvailable()) { /// You are Connected With The Internet } else { /// You Are Not Connected With The Internet }
Hi.
It's not good idea to ping google.com for detecting the internet connection status.Because i have tested (I use qt_app inside Debian 9) and measured a bandwidth used by google.com and telenor.no then as conclusions:
They consume a lot bandwidth in idle mode (google.com bandwidth = 3 * telenor.no).
I'm looking for a method for detecting internet connection status without be dependent to any server.
Please share if there are other idea without using QNetworkAccessManager
-
@Ketan__Patel__0011 said in How to check whether the computer connects the internet?:
@Qingshui-Kong
if you want to check your computer is connected with the internet or not
Then Try this ::
QNetworkAccessManager nam;
QNetworkRequest req(QUrl("http://www.google.com"));
QNetworkReply* reply = nam.get(req);
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();if (reply->bytesAvailable()) { /// You are Connected With The Internet } else { /// You Are Not Connected With The Internet }
Hi.
It's not good idea to ping google.com for detecting the internet connection status.Because i have tested (I use qt_app inside Debian 9) and measured a bandwidth used by google.com and telenor.no then as conclusions:
They consume a lot bandwidth in idle mode (google.com bandwidth = 3 * telenor.no).
I'm looking for a method for detecting internet connection status without be dependent to any server.
Please share if there are other idea without using QNetworkAccessManager
Yes You Can also use
Ping
Like this
if(QProcess::execute("ping -n 1 www.google.com") == 0) { // You Are Connected With The Internet. } else { // You Are Not Connected With The Internet. }
-
It is really no good idea to ping google for detecting a working internet connection.
Your customers will have to verify that they are not a bot on every google search afterwards.I have done this depending on the platform in native code:
Windows:
bool ReachabilityCheck::internetAvailable() { bool result = true; DWORD lpresult; BOOL winresult = InternetGetConnectedState(&lpresult,0); result = winresult == 1 ? true : false; return result; }
macOS:
bool ReachabilityCheck::internetAvailable() { struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress); if (reachability != NULL) { //NetworkStatus retVal = NotReachable; SCNetworkReachabilityFlags flags; if (SCNetworkReachabilityGetFlags(reachability, &flags)) { if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) { // If target host is not reachable return NO; } if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) { // If target host is reachable and no connection is required // then we'll assume (for now) that your on Wi-Fi return YES; } if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) || (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) { // ... and the connection is on-demand (or on-traffic) if the // calling application is using the CFSocketStream or higher APIs. if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) { // ... and no [user] intervention is needed return YES; } } // if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) // { // // ... but WWAN connections are OK if the calling application // // is using the CFNetwork (CFSocketStream?) APIs. // return YES; // } } } return NO; // return result; }
@euchkatzl
InternetGetConnectedState
is not recommended by Microsoft, it is recommended to use INetworkListManager::GetConnectivity instead.Here is an example I found.
-
@Ketan__Patel__0011 said in How to check whether the computer connects the internet?:
@Qingshui-Kong
if you want to check your computer is connected with the internet or not
Then Try this ::
QNetworkAccessManager nam;
QNetworkRequest req(QUrl("http://www.google.com"));
QNetworkReply* reply = nam.get(req);
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();if (reply->bytesAvailable()) { /// You are Connected With The Internet } else { /// You Are Not Connected With The Internet }
Hi.
It's not good idea to ping google.com for detecting the internet connection status.Because i have tested (I use qt_app inside Debian 9) and measured a bandwidth used by google.com and telenor.no then as conclusions:
They consume a lot bandwidth in idle mode (google.com bandwidth = 3 * telenor.no).
I'm looking for a method for detecting internet connection status without be dependent to any server.
Please share if there are other idea without using QNetworkAccessManager
@said_oslo This is what I am using:
bool nternetAvailable() { #ifdef Q_OS_WIN INetworkListManager* inlm; HRESULT hr = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_INetworkListManager, (LPVOID *)&inlm); if (SUCCEEDED(hr)) { NLM_CONNECTIVITY con; hr = inlm->GetConnectivity(&con); if(hr == S_OK) { if (con & NLM_CONNECTIVITY_IPV4_INTERNET || con & NLM_CONNECTIVITY_IPV6_INTERNET) return true; else return false; } } // default return true; #elif defined Q_OS_LINUX FILE *output; if(!(output = popen("/sbin/route -n | grep -c '^0\\.0\\.0\\.0'","r"))) { return 1; } unsigned int i; fscanf(output,"%u",&i); pclose(output); if(i==0) return false; else if(i==1) return true; #endif }
Use these headers(must be in this order)
#ifdef Q_OS_WIN #include <initguid.h> #include <netlistmgr.h> #endif
-
hi Brother,look this:
void ThreadObject::pingNetwork(QString remotIP)
{
QProcess cmd; //类似于window里面的cmd命令
QTextCodec *codec = QTextCodec::codecForName("GBK");
QString outstr;QString pingString="ping "+ remotIP + " -n 1"; cmd.start(pingString); //ping ip地址 -n 1表示只ping一次就结束 cmd.waitForFinished(-1); //等待ping完成 outstr = codec->toUnicode(cmd.readAll()); //将ping之后的结果全部读到outstr中 if(-1!=outstr.indexOf("往返行程的估计时间")) //通过判断有无“往返行程的估计时间”这几个字来检测网路是否通 { qDebug() << "connect success!"; emit signal_networkstate(true); //发送网络连接的信号 } else { qDebug() << "connect failed!"; emit signal_networkstate(false); //发送网络断开的信号 }
}
just change the URL to any one you like. thank you
-
hi Brother,look this:
void ThreadObject::pingNetwork(QString remotIP)
{
QProcess cmd; //类似于window里面的cmd命令
QTextCodec *codec = QTextCodec::codecForName("GBK");
QString outstr;QString pingString="ping "+ remotIP + " -n 1"; cmd.start(pingString); //ping ip地址 -n 1表示只ping一次就结束 cmd.waitForFinished(-1); //等待ping完成 outstr = codec->toUnicode(cmd.readAll()); //将ping之后的结果全部读到outstr中 if(-1!=outstr.indexOf("往返行程的估计时间")) //通过判断有无“往返行程的估计时间”这几个字来检测网路是否通 { qDebug() << "connect success!"; emit signal_networkstate(true); //发送网络连接的信号 } else { qDebug() << "connect failed!"; emit signal_networkstate(false); //发送网络断开的信号 }
}
just change the URL to any one you like. thank you
-
Ummm, why do you need to check for internet connection?
Why not just see if the resource you are looking for is accessible?
Say you have to access "myawesomedomain.com".
Then try to access that domain. Maybe use an api:
myawesomedomain.com/status
If this access fails you tell the user that the resource is not accessible. Please check your internet connectivity. They can usually figure out its a connection problem. I would make the status separate from any services you use on the domain. That way you can tell in your app if a server on your domain is down, or if the network connection is not good.However if the check you use fails. Say checking for internet connection. And there is nothing wrong with their internet connection. They will think there is something wrong with your app.
-
fcarney is right -- What's the underlying question? Trying to determine if you are connected to the Internet is almost never useful information, and it's almost impossible to define well.
Is there a particular service you want to connect to? Just try to connect to that. Don't check if there's an internet connection an then only try to connect to the service if you think there's an Internet connection. You will drive users crazy when your Internet check fails despite having a route to your service. And when things work, it will be slower for no reason while you spend time trying to convince yourself there is an Internet connection.
-
Yes You Can also use
Ping
Like this
if(QProcess::execute("ping -n 1 www.google.com") == 0) { // You Are Connected With The Internet. } else { // You Are Not Connected With The Internet. }
@Ketan__Patel__0011
Hi.
For connecting my system i use websocketpp
I used the code below it works.
Why when my Beagle board lose connection (internet) to the server does not reconnect again.
I need all the time to reboot the system !!
There's an idea to reconnect the system fastly after internet returned back ?void DBNetworkReachability::checkReachability() { m_WebCtrl->clearAccessCache(); QUrl qurl("http://www.telenor.no"); QNetworkRequest request(qurl); QNetworkReply* reply = m_WebCtrl->get(request); connect( reply, SIGNAL(finished()),this, SLOT(replyFinished()) ); // added QEventLoop loop; QObject::connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit())); // QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); if(!reply->isFinished()) loop.exec(); if(reply->bytesAvailable()){ qDebug() << "You are connected to the internet :)"; } else{ qDebug() << "You are not connected to the internet :("; qDebug() << "Reconnecting"; QObject::connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit())); } }
-
@Ketan__Patel__0011
Hi.
For connecting my system i use websocketpp
I used the code below it works.
Why when my Beagle board lose connection (internet) to the server does not reconnect again.
I need all the time to reboot the system !!
There's an idea to reconnect the system fastly after internet returned back ?void DBNetworkReachability::checkReachability() { m_WebCtrl->clearAccessCache(); QUrl qurl("http://www.telenor.no"); QNetworkRequest request(qurl); QNetworkReply* reply = m_WebCtrl->get(request); connect( reply, SIGNAL(finished()),this, SLOT(replyFinished()) ); // added QEventLoop loop; QObject::connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit())); // QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); if(!reply->isFinished()) loop.exec(); if(reply->bytesAvailable()){ qDebug() << "You are connected to the internet :)"; } else{ qDebug() << "You are not connected to the internet :("; qDebug() << "Reconnecting"; QObject::connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit())); } }
@said_oslo what do you mean exactly by "reconnect the system"? Is there any task that you must resume after reconnecting to internet? Do you need the application to stay on stand-by until internet returns?