Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

How to check whether the computer connects the internet?



  • 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.

    1. 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.

    2. 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!


  • Moderators

    To clarify - you want to know if computer is connected to a network or Internet?

    Because QNetworkConfigurationManager::isOnline() will return true when connected to a network (LAN, WiFi etc.).

    I think the only reliable way of checking if there is Internet connectivity is to ping a server. If you get a reply from some server (either one you own or - that's a bit ugly - external one like google.com), then Internet is connected. If it times out - no Internet.

    On Android, there is an API for this - the system checks connectivity for you (it pings google.com).



  • @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.


  • Moderators

    See documentation for QNAM. The description there shows how to send a request and check it's status/ reply.



  • @sierdzio
    OK, thank you!
    I will read it first.



  • 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;
    }
    


  • @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.



  • This post is deleted!


  • @euchkatzl
    Will the macOS code work on linux?? I don't have linux installed to test it yet


  • Moderators

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

    No, SCNetworkReachabilityRef is only available on macOS.



  • @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
                   }
    


  • @sierdzio thanks, do you know the linux version of that code?

    @Ketan__Patel__0011 read @euchkatzl 's answer above



  • @hbatalha

    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.



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

    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.
    }
    

Log in to reply