Programmatically check whether my machine has internet access or not

前端 未结 6 1573
面向向阳花
面向向阳花 2020-12-17 17:23

How can I programmatically check whether my machine has internet access or not using C/C++, is it just a matter of pinging an IP? How does NIC do it ? I mean something like

相关标签:
6条回答
  • 2020-12-17 18:01

    In addition to the InternetCheckConnection() function, The Win32 API has a function ( InternetGetConnectedState() ) which returns a true/false for (the availability of) some form of internet connectivity:

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa384702(v=vs.85).aspx

    It also tells you what type of connection to the internet you have(LAN, modem, Proxy etc) - which can often be very handy to know.

    0 讨论(0)
  • 2020-12-17 18:03

    If you work on Windows, just try this

    #include <iostream>
    #include <windows.h> 
    #include <wininet.h>
    using namespace std;
    
    int main(){
    
    if(InternetCheckConnection(L"http://www.google.com",FLAG_ICC_FORCE_CONNECTION,0))
    {
            cout << "connected to internet";
    }
    
    return 0;
    }
    
    0 讨论(0)
  • 2020-12-17 18:08

    There is nothing of that sort I think, but you can try this:

    The easiest way is to try to connect to a known outside IP address.

    If it fails in Windows, the connect function will return SOCKET_ERROR, and WSAGetLastError will usually return WSAEHOSTUNREACH (meaning the packet couldn't be sent to the host).

    In Linux, you'll get back a -1, and errno will be ENETUNREACH. Some useful links:

    1. Link for Windows Sockets

    2. Link for Linux/Unix sockets

    0 讨论(0)
  • 2020-12-17 18:12

    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;
    }
    
    0 讨论(0)
  • 2020-12-17 18:16

    The following code will work, if you're on windows:

    #include <iostream>
    #include <windows.h>
    
    int main(){
    
      if (system("ping www.google.com")){
              std::cout<<"\nNot connnected to the internet\n\n";
      }
      else{
              std::cout<<"\nConnected to the internet\n\n";
    
      }
      system("pause");
      return 0;
    }
    
    0 讨论(0)
  • 2020-12-17 18:24

    There is actually a very smart way including code snip here.

    It basically using the cmd option: While in CMD hit: route print.

    This will map routing table with an array and will look for 0.0.0.0 as an available internet connection.

    I used it with a while(true){//the code in here } //check for inet connection , else will sleep for 10 mins and check again

    0 讨论(0)
提交回复
热议问题