Programmatically check whether my machine has internet access or not

前端 未结 6 1591
面向向阳花
面向向阳花 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条回答
  •  猫巷女王i
    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 
    #include       // include the base COM header
    #include 
    
    // 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;
    }
    

提交回复
热议问题