Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to check whether the computer connects the internet?
Forum Updated to NodeBB v4.3 + New Features

How to check whether the computer connects the internet?

Scheduled Pinned Locked Moved Unsolved General and Desktop
30 Posts 14 Posters 16.6k Views 7 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E euchkatzl

    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;
    }
    
    H Offline
    H Offline
    hbatalha
    wrote on last edited by
    #18

    @euchkatzl InternetGetConnectedState is not recommended by Microsoft, it is recommended to use INetworkListManager::GetConnectivity instead.

    Here is an example I found.

    1 Reply Last reply
    1
    • said_osloS said_oslo

      @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

      H Offline
      H Offline
      hbatalha
      wrote on last edited by hbatalha
      #19

      @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
      
      1 Reply Last reply
      0
      • Qterry.wangQ Offline
        Qterry.wangQ Offline
        Qterry.wang
        wrote on last edited by
        #20

        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

        Have a good day !

        H 1 Reply Last reply
        0
        • Qterry.wangQ Qterry.wang

          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

          H Offline
          H Offline
          hbatalha
          wrote on last edited by
          #21

          @Qterry-wang I would say it is never a good idea to use QProcess::waitForFinished(int) since it freezes the main (GUI) thread, might result in a bad user experience of your application.

          1 Reply Last reply
          1
          • fcarneyF Offline
            fcarneyF Offline
            fcarney
            wrote on last edited by
            #22

            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.

            C++ is a perfectly valid school of magic.

            1 Reply Last reply
            3
            • W Offline
              W Offline
              wrosecrans
              wrote on last edited by
              #23

              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.

              1 Reply Last reply
              2
              • Ketan__Patel__0011K Ketan__Patel__0011

                @said_oslo

                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.
                }
                
                said_osloS Offline
                said_osloS Offline
                said_oslo
                wrote on last edited by said_oslo
                #24

                @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()));      
                   }
                
                }
                
                H 1 Reply Last reply
                0
                • said_osloS said_oslo

                  @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()));      
                     }
                  
                  }
                  
                  H Offline
                  H Offline
                  hbatalha
                  wrote on last edited by
                  #25

                  @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?

                  1 Reply Last reply
                  0
                  • A Offline
                    A Offline
                    adazem009
                    wrote on last edited by
                    #26

                    This works fine for me and doesn't "wait for reply" when there's no internet connection:

                    bool internetConnected(void)
                    {
                    	QTimer timer;
                    	timer.setInterval(3000);
                    	timer.setSingleShot(true);
                    	QEventLoop eventLoop;
                    	QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
                    	QDnsLookup lookup;
                    	QObject::connect(&lookup, &QDnsLookup::finished, &eventLoop, &QEventLoop::quit);
                    	lookup.setType(QDnsLookup::A);
                    	lookup.setName("dns.google.com");
                    	lookup.lookup();
                    	timer.start();
                    	eventLoop.exec();
                    	if(timer.remainingTime() == 0)
                    	{
                    		lookup.abort();
                    		return false;
                    	}
                    	if(lookup.error() != QDnsLookup::NoError)
                    		return false;
                    	return true;
                    }
                    

                    Note that this function is synchronous, so it might freeze the UI for some time (0 - 3 seconds) if the connection is slow.
                    But seems to return immediately with a regular connection.

                    W 1 Reply Last reply
                    1
                    • Q Qingshui Kong

                      @sierdzio
                      Thank you!
                      Yes, I want to know if computer is connected to Internet.

                      To ping a server is also a solution I find on the Internet. But I don't know how to check the result with QT. Maybe I should have a try first.

                      W Offline
                      W Offline
                      wrosecrans
                      wrote on last edited by
                      #27
                      This post is deleted!
                      1 Reply Last reply
                      0
                      • A adazem009

                        This works fine for me and doesn't "wait for reply" when there's no internet connection:

                        bool internetConnected(void)
                        {
                        	QTimer timer;
                        	timer.setInterval(3000);
                        	timer.setSingleShot(true);
                        	QEventLoop eventLoop;
                        	QObject::connect(&timer, &QTimer::timeout, &eventLoop, &QEventLoop::quit);
                        	QDnsLookup lookup;
                        	QObject::connect(&lookup, &QDnsLookup::finished, &eventLoop, &QEventLoop::quit);
                        	lookup.setType(QDnsLookup::A);
                        	lookup.setName("dns.google.com");
                        	lookup.lookup();
                        	timer.start();
                        	eventLoop.exec();
                        	if(timer.remainingTime() == 0)
                        	{
                        		lookup.abort();
                        		return false;
                        	}
                        	if(lookup.error() != QDnsLookup::NoError)
                        		return false;
                        	return true;
                        }
                        

                        Note that this function is synchronous, so it might freeze the UI for some time (0 - 3 seconds) if the connection is slow.
                        But seems to return immediately with a regular connection.

                        W Offline
                        W Offline
                        wrosecrans
                        wrote on last edited by
                        #28

                        @adazem009 Why are you responding to a two year old thread?

                        A 1 Reply Last reply
                        0
                        • W wrosecrans

                          @adazem009 Why are you responding to a two year old thread?

                          A Offline
                          A Offline
                          adazem009
                          wrote on last edited by
                          #29

                          @wrosecrans Just in case someone has the same problem. I actually found this thread when I was looking for a solution.

                          Kent-DorfmanK 1 Reply Last reply
                          0
                          • A adazem009

                            @wrosecrans Just in case someone has the same problem. I actually found this thread when I was looking for a solution.

                            Kent-DorfmanK Offline
                            Kent-DorfmanK Offline
                            Kent-Dorfman
                            wrote on last edited by
                            #30

                            @adazem009

                            Some variant of this question surfaces every few months, almost always initiated by someone who really does not understand what the internet is. InterNet in itself is an ambiguous term. It is a network of interconnected networks. There is no internet point of authority to ping with and come to the conclusion "I can reach the internet". It is by nature designed so that some segments may be reached even if other large portions are down. So, you need to be very specific with your intentions and expectations when branching outside of your LAN (local area network).

                            1 Reply Last reply
                            2

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved