Подключен ли компьютер к интернету

Вариант 1

Существует много способов определения, в сети ли компьютер (имеется в виду не сеть, в которой 220 вольт, а net, в данном случае Internet). Некоторые способы, такие как пингование какого-нибудь IP'шника очень опасны, имхо, по нескольким причинам. Во-первых, если человек не в сети, то высветиться табличка, что "некто пытается соединиться с серваком таким-то, не хотите соединиться (Да/нет)". Можно, конечно, пинговать сайт Microsoft'а и свалить все на вынды, но надо ли это, если есть другие способы.

Правильность работы функции не гарантирую, но работать должно (много не тестил эту функцию).
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <conio.h>

typedef BOOL (WINAPI* INETCHECKPROC) (LPDWORD lpdwFlags, DWORD dwReserved);

bool GetStatusConnect()
// возвращает 1, если комп подключен к интеренту, в противном случае - 0
{
    
bool bRetVal;
    
HINSTANCE hLib = NULL;
    
INETCHECKPROC pfnInternetGetConnectedState;

// грузим (в смысле загружаем) библиотеку wininet.dll
    
hLib = LoadLibrary("wininet.dll");
    
if (!hLib) // если не получилось загрузить библиотеку, то
        
return 0; // возвращаем 0


// получаем адрес функции InternetGetConnectedState
    
pfnInternetGetConnectedState = (INETCHECKPROC)GetProcAddress(hLib, "InternetGetConnectedState");

// Если не удалось получить адрес функции
    
if(!pfnInternetGetConnectedState)
        
return false; // возвращаем 0

    
DWORD lpdwFlags;

// проверяем соединение
    
bRetVal = pfnInternetGetConnectedState(&lpdwFlags, 0) != 0;

    
FreeLibrary(hLib); // выгружаем библиотеку
    
return bRetVal; // возвращаем статус подключения
}

void main(void)
{
    
printf(GetStatusConnect()?"Connected":"Disconnected"); // выводим статус соединения
    
printf("\r\nPress any key to continue"); // просим юзверя нажать "any key" на клавиатуре
    
while(!_getch()); // ждем нажатия кнопки
    
return; // выходим
}

Вариант 2

Есть еще один способ проверки соединения компа с интернетом.
#include <stdio.h>
#include <pdh.h>
#include <conio.h>

/*******************************************************************************/
/********                                                               ********/
/********                                                               ********/
/********            не забудьте включить в проект "pdh.lib"            ********/
/********                                                               ********/
/********    Project -> Settings -> Link -> Object / Library Modules    ********/
/********                                                               ********/
/********                                                               ********/
/*******************************************************************************/


/*******************************************************************************/
/***********                                                         ***********/
/***********            PDH - performance data helper                ***********/
/***********                                                         ***********/
/*******************************************************************************/


/**************************** Описание наших функций ***************************/

#define PDH_ERROR -1

// Функция инициализирует PDH (performance data helper)
PDH_STATUS pdh_Init (HQUERY &hQuery, HCOUNTER &hCounter);


// Функция возвращает в случае удачи скорость соединения, в противном случае PHG_ERROR (-1)
int GetInternetSpeed (HQUERY hQuery, HCOUNTER hCounter, PDH_STATUS &pdhStatus);


// Функция анинициализирует PDH
void pdh_Uninit (HQUERY hQuery, HCOUNTER hCounter);


// Функция показывает сообщение об ошибке
void ShowErrorMessage(PDH_STATUS pdhStatus);


// хмм... в названии функции все сказано!
void begin();

/****************************************************************************/


void main(void)
{
    
begin();
    
    
printf(TEXT("Press any key to continue")); // нажмите "any key" на клавиатуре :P
    
while (!_getch()); // ждем, пока юзверь не "клацнет" "any key"
}

void begin()
// хмм... в названии функции все сказано!
{
    
PDH_STATUS  pdhStatus      = 0;

    
HQUERY hQuery;
    
HQUERY hCounter;
    
int iSpeed;
    
pdhStatus = pdh_Init(hQuery, hCounter); // инициализируем PDH

// если не произошел облом с иницализации PDH, то
    
if ( pdhStatus == ERROR_SUCCESS )
    {
        
printf("Press Esc to exit\r\n");
// пока юзверь не зажмет клавишу Esc, то
        
while (GetKeyState(VK_ESCAPE) >= 0)
        {
// получаем скорость соединения
            
iSpeed = GetInternetSpeed(hQuery, hCounter, pdhStatus);

// если не произошла ошибка (т.е. не вернулось значение PHG_ERROR)
            
if (iSpeed != PDH_ERROR)
                
printf("Online. Speed: %i\r\n", iSpeed); // выводим значение
            
else // а если произошла ошибка, то
                
printf("Offline\r\n");

            
Sleep(500); // ждем 0.5 секунд(ы)
        
}

// если юзверь все-таки клацнул Esc, то флаг ему в руки :)
        
pdh_Uninit(hQuery, hCounter); // заканчиваем работу с PDH
    
}
    
else // если произошла ошибка при инициализации PDH
        
ShowErrorMessage(pdhStatus); // показываем Еррорное сообщение
    
pdh_Uninit(hQuery, hCounter); // заканчиваем работу с PDH
}

void ShowErrorMessage(PDH_STATUS pdhStatus)
// Сама функция показа сообщения об ошибке
{
    
LPSTR szMessage = NULL;

// грузим строку с ошибкой в szMessage. Память выделит функция
    
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                    
FORMAT_MESSAGE_FROM_HMODULE,
                    
GetModuleHandle("PDH.DLL"), pdhStatus,
                    
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                    
szMessage, 0, NULL);

    
if (szMessage)
        
printf("Error №%i:  %s\r\n", pdhStatus, szMessage); // показываем ошибку
    
else
        
printf("Offline\r\n");

    
LocalFree(szMessage); // очищаем буфер
}

PDH_STATUS pdh_Init(HQUERY &hQuery, HCOUNTER &hCounter)
// инициализируем PDH
{
    
PDH_STATUS  pdhResult   = 0;
    
CHAR        szCounterPath[1024];
    
DWORD       dwType      = 0;
    
    
pdhResult = PdhOpenQuery( NULL, 0, &hQuery ); // запрос на открытие PDH
    
    
if ( pdhResult != ERROR_SUCCESS ) // если была ошибка, то
        
return pdhResult; // выходим, возвращая номер ошибки

    
strcpy(szCounterPath, "\\Network Interface(WAN [PPP_SLIP] Interfacee)\\Current Bandwidth");

// открываем счетчик PDH
    
pdhResult = PdhAddCounter(hQuery, szCounterPath, 0, &hCounter);

    
if (pdhResult != ERROR_SUCCESS) // если была ошибка, то
        
return pdhResult; // выходим, возвращая номер ошибки

// если дошли до этого места, то ошибки на 100% не было!
    
return pdhResult;
}

int GetInternetSpeed(HQUERY hQuery, HCOUNTER hCounter, PDH_STATUS &pdhStatus)
// получаем скорость соединения
{
    
pdhStatus = 0;
    
DWORD       dwType      = 0;

// даем запрос на сборы инфы
    
pdhStatus = PdhCollectQueryData(hQuery);

    
if (pdhStatus != ERROR_SUCCESS) // если была ошибка, то
        
return PDH_ERROR; // выходим, возвращая ошибку

    
_PDH_FMT_COUNTERVALUE pfci;
    
ZeroMemory(&pfci, sizeof(pfci)); // очищаем структуру pfci

// Получаем инфу о скорости!
    
pdhStatus = PdhGetFormattedCounterValue( hCounter, PDH_FMT_DOUBLE, &dwType, &pfci);
    
    
if (pdhStatus != ERROR_SUCCESS) // если была ошибка, то
        
return PDH_ERROR; // выходим, возвращая ошибку

    
return (int)pfci.doubleValue; // возвращаем скорость соединения!
}

void pdh_Uninit(HQUERY hQuery, HCOUNTER hCounter)
// анинициализация
{
    
PdhRemoveCounter(hCounter); // удаляем счетчик
    
PdhCloseQuery(hQuery); // закрываем запрос
}

Вариант 3

#include <windows.h>
#include <Ras.h>
#include <stdio.h>
#include <conio.h>

/*****************************************************************************/
/********                                                             ********/
/********                                                             ********/
/********        не забудьте включить в проект "Rasapi32.lib"         ********/
/********                                                             ********/
/********    Project -> Settings -> Link -> Object/Library Modules    ********/
/********                                                             ********/
/********                                                             ********/
/*****************************************************************************/

void main(void)
{
    
int nRet = 0;
    
DWORD lpcb=0, lpcConnections=0;

// выделяем память под RASCONN
    
LPRASCONN lpRasConn = (LPRASCONN)GlobalAlloc(GPTR, sizeof(RASCONN));
    
// заполняем поле размер в структуре RASCONN    
    
lpRasConn->dwSize = sizeof(RASCONN);

// получаем количество соединений
    
nRet = RasEnumConnections(lpRasConn, &lpcb, &lpcConnections);

// Если количество соединений не равно 0, то
// выводим "Connected", в противном случае, "Disconnected
    
printf((lpcConnections)?"Connected.\r\nNumber of connections: %i":"Disconnected", lpcConnections);

    
GlobalFree(lpRasConn);

    
printf("\r\nPress any key to continue"); // просим юзверя нажать "any key" на клавиатуре

    
while (!_getch()); // ждем нажатия кнопки

    
return; // выходим
}
 
« Предыдущая статья   Следующая статья »