Вариант 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; // выходим } |