InternetCheckConnection总是返回false

问题描述 投票:3回答:4

我想使用 Wininet 功能 InternetCheckConnection 来检查机器何时连接到互联网并能访问特定的主机.问题是这个函数总是返回 假的,无论我把它的URL。

MSDN链接

windows connection wininet
4个回答
5
投票

我在Windows 7和Windows XP SP3上使用以下组合。

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

如果连接是可能的,GetLastError()返回0,如果不可能,则返回12029(连接服务器的尝试失败)。

下面的组合对我来说不适用。

  InternetCheckConnection(NULL, FLAG_ICC_FORCE_CONNECTION, 0) ;

GetLastError()返回12016(请求的操作无效)。

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

对于这两个组合,GetLastError()返回2250(无法找到网络连接)。


3
投票

你有没有检查过 GetLastError() ? 如果我没有看错的话,你需要检查一下 ERROR_NOT_CONNECTED 以确定您是否真正处于离线状态。


0
投票

只是一个胡乱的猜测,但也许这是由于个人防火墙阻止了Windows DLLs和或你的应用程序之一的所有传出连接?


0
投票

根据微软的API文档 互联网检查连接 已被废弃。

InternetCheckConnection可用于需求一节中指定的操作系统。它可能在后续版本中被更改或不可用。请使用NetworkInformation.GetInternetConnectionProfile或NLM接口。]

除了这个API,我们还可以使用 INetworkListManager 接口,用于检查windows平台的互联网是否连接。

下面是win32的代码库。

    #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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.