gmuller
gmuller

Reputation: 451

InternetCheckConnection always return false

I want to use the Wininet function InternetCheckConnection to check whenever the machine is connected to the internet and can access a specific host. The problem is that this function is always returning false, no matter the URL I put on it.

MSDN link

Upvotes: 3

Views: 7702

Answers (4)

consequence007
consequence007

Reputation: 2160

According to Microsoft API document InternetCheckConnection is deprecated.

[InternetCheckConnection is available for use in the operating systems specified in the Requirements section. It may be altered or unavailable in subsequent versions. Instead, use NetworkInformation.GetInternetConnectionProfile or the NLM Interfaces. ]

Instead of this API we can use INetworkListManager interface to check whether Internet is connected or not for windows platform.

Here below is the win32 codebase :

    #include <iostream>
    #include <ObjBase.h>      // include the base COM header
    #include <Netlistmgr.h>

    // Instruct linker to link to the required COM libraries
    #pragma comment(lib, "ole32.lib")

    using namespace std;

    enum class INTERNET_STATUS
    {
        CONNECTED,
        DISCONNECTED,
        CONNECTED_TO_LOCAL,
        CONNECTION_ERROR
    };

    INTERNET_STATUS IsConnectedToInternet();

    int main()
    {
        INTERNET_STATUS connectedStatus = INTERNET_STATUS::CONNECTION_ERROR;
        connectedStatus = IsConnectedToInternet();
        switch (connectedStatus)
        {
        case INTERNET_STATUS::CONNECTED:
            cout << "Connected to the internet" << endl;
            break;
        case INTERNET_STATUS::DISCONNECTED:
            cout << "Internet is not available" << endl;
            break;
        case INTERNET_STATUS::CONNECTED_TO_LOCAL:
            cout << "Connected to the local network." << endl;
            break;
        case INTERNET_STATUS::CONNECTION_ERROR:
        default:
            cout << "Unknown error has been occurred." << endl;
            break;
        }
    }

    INTERNET_STATUS IsConnectedToInternet()
    {
        INTERNET_STATUS connectedStatus = INTERNET_STATUS::CONNECTION_ERROR;
        HRESULT hr = S_FALSE;

        try
        {
            hr = CoInitialize(NULL);
            if (SUCCEEDED(hr))
            {
                INetworkListManager* pNetworkListManager;
                hr = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, __uuidof(INetworkListManager), (LPVOID*)&pNetworkListManager);
                if (SUCCEEDED(hr))
                {
                    NLM_CONNECTIVITY nlmConnectivity = NLM_CONNECTIVITY::NLM_CONNECTIVITY_DISCONNECTED;
                    VARIANT_BOOL isConnected = VARIANT_FALSE;
                    hr = pNetworkListManager->get_IsConnectedToInternet(&isConnected);
                    if (SUCCEEDED(hr))
                    {
                        if (isConnected == VARIANT_TRUE)
                            connectedStatus = INTERNET_STATUS::CONNECTED;
                        else
                            connectedStatus = INTERNET_STATUS::DISCONNECTED;
                    }

                    if (isConnected == VARIANT_FALSE && SUCCEEDED(pNetworkListManager->GetConnectivity(&nlmConnectivity)))
                    {
                        if (nlmConnectivity & (NLM_CONNECTIVITY_IPV4_LOCALNETWORK | NLM_CONNECTIVITY_IPV4_SUBNET | NLM_CONNECTIVITY_IPV6_LOCALNETWORK | NLM_CONNECTIVITY_IPV6_SUBNET))
                        {
                            connectedStatus = INTERNET_STATUS::CONNECTED_TO_LOCAL;
                        }
                    }

                    pNetworkListManager->Release();
                }
            }

            CoUninitialize();
        }
        catch (...)
        {
            connectedStatus = INTERNET_STATUS::CONNECTION_ERROR;
        }

        return connectedStatus;
    }

Upvotes: 0

Jabberwocky
Jabberwocky

Reputation: 50822

Following combination works for me on Windows 7 and Windows XP SP3:

 InternetCheckConnection("http://www.google.com", FLAG_ICC_FORCE_CONNECTION, 0) ;

GetLastError() returns 0 if the connexion is possible and it returns 12029 (The attempt to connect to the server failed) if not.

Following combonations don't work for me :

  InternetCheckConnection(NULL, FLAG_ICC_FORCE_CONNECTION, 0) ;

GetLastError() returns 12016 (The requested operation is invalid).

  InternetCheckConnection(NULL, 0, 0) ;
  InternetCheckConnection(("http://www.google.com", 0, 0) ;

for both GetLastError() returns 2250 (The network connection could not be found).

Upvotes: 5

MSalters
MSalters

Reputation: 179917

Have you checked GetLastError() ? If I read MSDN correctly, you would need to check for ERROR_NOT_CONNECTED to determine whether you're truly offline.

Upvotes: 3

Adrian Grigore
Adrian Grigore

Reputation: 33318

Just a wild guess, but perhaps this is due to a personal firewall blocking all outgoing connections for one of the Windows DLLs and / or your application?

Upvotes: 0

Related Questions