Программно проверить, есть ли у моей машины доступ в интернет или нет

Как программно проверить, есть ли у моей машины доступ в Интернет или нет с использованием C/C++, это просто вопрос проверки связи с IP? Как NIC это делает? Я имею в виду что-то вроде:

Я использую Windows 7.

5 ответов

Решение

Если вы работаете в 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;
}

Согласно документу Microsoft API, InternetCheckConnection устарел.

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

В дополнение к функции InternetCheckConnection(), API-интерфейс Win32 имеет функцию (InternetGetConnectedState ()), которая возвращает значение true / false для (наличия) некоторой формы подключения к Интернету:

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

Он также сообщает вам, какой тип подключения к Интернету у вас есть (локальная сеть, модем, прокси и т. Д.), Что часто очень удобно знать.

Я думаю, что нет ничего подобного, но вы можете попробовать это:

Самый простой способ - попытаться подключиться к известному внешнему IP-адресу.

Если в Windows произойдет сбой, функция подключения вернется SOCKET_ERROR, а также WSAGetLastError будет обычно возвращаться WSAEHOSTUNREACH (то есть пакет не может быть отправлен на хост).

В Linux вы получите -1и будет ошибаться ENETUNREACH, Несколько полезных ссылок:

1. Ссылка для сокетов Windows

2. Ссылка для сокетов Linux/Unix

На самом деле есть очень умный способ, включая отсечение кода.

Это в основном с помощью параметра 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

Следующий код будет работать, если вы находитесь на окнах:

#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;
}
Другие вопросы по тегам