以编程方式检查我的机器是否具有Internet访问权限

时间:2013-04-03 03:34:22

标签: c++ c connectivity nic

如何以编程方式检查我的机器是否具有使用C / C ++的Internet访问权限,是否仅仅是ping IP? NIC如何做到这一点?我的意思是:

enter image description here

我使用的是Windows 7。

6 个答案:

答案 0 :(得分:12)

如果您使用的是Windows,请尝试使用

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

答案 1 :(得分:4)

我认为没有那种,但你可以试试这个:

最简单的方法是尝试连接到已知的外部IP地址。

如果在Windows中失败,则connect函数将返回SOCKET_ERROR,而WSAGetLastError通常会返回WSAEHOSTUNREACH(意味着无法将数据包发送到主机)。

在Linux中,您将获得-1,而errno将为ENETUNREACH。 一些有用的链接:

1. Link for Windows Sockets

2. Link for Linux/Unix sockets

答案 2 :(得分:3)

除了InternetCheckConnection()函数之外,Win32 API还有一个函数( InternetGetConnectedState()),它为某种形式的互联网连接(可用性)返回true / false:

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

它还告诉您与互联网的连接类型(局域网,调制解调器,代理等) - 这通常非常方便。

答案 3 :(得分:2)

实际上有一种非常聪明的方法,包括代码片段here

它基本上使用 cmd 选项:在CMD中点击:route print

这会将路由表映射到一个数组,并将0.0.0.0作为可用的互联网连接。

我将它与while(true){//the code in here } //check for inet connection , else will sleep for 10 mins and check again

一起使用

答案 4 :(得分:2)

根据Microsoft API文档 InternetCheckConnection ,已弃用。

[InternetCheckConnection可用于“需求”部分中指定的操作系统。在后续版本中可能会更改或不可用。而是使用NetworkInformation.GetInternetConnectionProfile或NLM接口。 ]

我们可以使用 INetworkListManager 接口代替该API来检查Windows平台是否已连接Internet。

以下是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;
}

答案 5 :(得分:-1)

如果您使用的话,以下代码将起作用:

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