Всем привет! Подскажите как самым оптимальным условием проверить подключение к инету на С++ вот примерно такой структурой Code: If {условие} остальной код
реальное подключение к инету ты можешь проверить тока определив ip какогонить крупного сайта. типа определить имя ip адрес google.com Если определился, значит инет есть. Хотя если юзается кеш DNS то может и не быть инета, а данные берутся из кеша. Но самый действенный способ - просто подрубиться к какомунить сайта, есть подрубился и получил страницу, то инет есть. Единственное что не провериш, если доступ в инет через прокси идет.
slesh, DNS, www от этих сервисов не всегда можно получить достоверную инфу. Некоторые ISP отдают зоны даже при отключ. инете, с www - прокся. Обычно админы используют icmp на шлюз. Т.е. если шлюз доступен - инет работает или проблема у ISP, если шлюз не доступен - инета и быть не может
так думаю вернее будет Code: #include <WinSock2.h> #pragma comment(lib, "ws2_32") BOOL IsOnline() { WSADATA wsd; WSAStartup(0x202, &wsd); SOCKET sck; SOCKADDR_IN addr; int rc; addr.sin_family = AF_INET; // standard http port addr.sin_port = htons(80); // mail.ru ip addr.sin_addr.S_un.S_addr = inet_addr("217.69.128.44"); sck = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); rc = connect(sck, (LPSOCKADDR)&addr, sizeof(addr)); if(rc == 0){ closesocket(sck); return TRUE; } return FALSE; } int _tmain(int argc, _TCHAR* argv[]) { if(IsOnline()){ MessageBox(0, "ONLINE", 0, 0); }else{ MessageBox(0, "OFFLINE", 0, 0); } return 0; }
Code: #undef UNICODE #include <winsock2.h> #pragma comment( lib, "wsock32.lib" ) int main(int argc, char* argv[]) { sockaddr_in s_a; WSADATA wd; WSAStartup( MAKEWORD( 2, 2 ), &wd ); SOCKET s = socket( AF_INET, SOCK_STREAM, 0 ); if (s == INVALID_SOCKET) { return 255; } s_a.sin_addr.s_addr = inet_addr( "217.69.128.44" ); s_a.sin_port = htons( 80 ); s_a.sin_family = AF_INET; if (connect( s, (struct sockaddr*)&s_a, sizeof( s_a ) ) == SOCKET_ERROR) { MessageBox(0,"OFFLINE!","Winname",MB_OK); } else { MessageBox(0,"ONLINE!!","Winname",MB_OK); } closesocket( s ); WSACleanup(); return 0; } Вот без создания ф-и. Если нужен постоянный мониторинг - юзай цикл.
А вот пару примеров, из которых два выше варианта работать не будут: 217.69.128.44 упал на 10 сек, а в этот момент была проверка Траблы с маршрутизацией, BGP такое дело И снова коннект на 80 порт, это не разумно проверять конект на веб-сервер
tracert до отрезолвленного msn.com условие присутствия интернета это ответ следующего за вашим гейта! ... хотя можно и пингануть гейт провайдера! Интернет - это не америка не корневые ДНС сервера! Интернет -это среда переноса информации!
ну свой гейт комп знает ....поэтому в логике я и писал трейсерт (icmp c временем жизни +1 от времени TTL при котором ответил свой гейт)
хахах, так тоже и с гейтом может быть. на мой вкус - выбрать например Х белых статических ип и действовать в соответствии что пингуется по меньшей мере один из них и все. к томуже - пинг многие экраны закрывают, поэтому самое надежное - пробовать установить связь с веб-интерфейсом
Нет пинг со стороны .... adsl модема ,media("оптического") маршрутизатора закрыть провайдер не может .... если не обновятся arp таблицы то и связи не будет между вашим гейтом и гейтом провайдера ни какая IOS не поможет ! Пинг по условию должен править(обновлять) arp таблицы.... поэтому найдите мне того кто сидит в инете и у кого не пингуется дефаулт гейт провайдера и я возьму слова обратно! даже если пинг не отвечает .... модем делает пинг, перед этим модем(маршрутизатор просматривает arp таблицу) и если нет записи для гейта .... делает arp запрос и получает arp ответ от маршрутизатора провайдера! далее следует ICMP итд.... ПИНГ - инициатор ARP ЗАПРОСА! ... конечно я понимаю что есть уровень юзера , дак у юзера я могу зарубить что угодно 8))... ... дайте мне юзверя и я ему обрежу хоть яйца хоть уши! 8))
А можно посмотреть на эту доку, плиз? С нормальными роутерами такого не бывает! А у провайдеров верхнего уровня хорошие роутеры, можно не волноваться