Условие подключения к инету

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by marcos, 29 Dec 2009.

  1. marcos

    marcos New Member

    Joined:
    8 Nov 2009
    Messages:
    111
    Likes Received:
    1
    Reputations:
    -5
    Всем привет!
    Подскажите как самым оптимальным условием проверить подключение к инету на С++

    вот примерно такой структурой
    Code:
    If {условие}
    остальной код
     
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    реальное подключение к инету ты можешь проверить тока определив ip какогонить крупного сайта.
    типа определить имя ip адрес google.com
    Если определился, значит инет есть. Хотя если юзается кеш DNS то может и не быть инета, а данные берутся из кеша.

    Но самый действенный способ - просто подрубиться к какомунить сайта, есть подрубился и получил страницу, то инет есть. Единственное что не провериш, если доступ в инет через прокси идет.
     
  3. lo0

    lo0 Elder - Старейшина

    Joined:
    6 Mar 2006
    Messages:
    113
    Likes Received:
    20
    Reputations:
    14
    slesh, DNS, www от этих сервисов не всегда можно получить достоверную инфу.
    Некоторые ISP отдают зоны даже при отключ. инете, с www - прокся.
    Обычно админы используют icmp на шлюз. Т.е. если шлюз доступен - инет работает или проблема у ISP, если шлюз не доступен - инета и быть не может :)
     
  4. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,032
    Likes Received:
    1,320
    Reputations:
    327
    так думаю вернее будет

    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;
    }
    
     
    1 person likes this.
  5. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    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;
    	}
    Вот без создания ф-и.
    Если нужен постоянный мониторинг - юзай цикл.
     
    1 person likes this.
  6. lo0

    lo0 Elder - Старейшина

    Joined:
    6 Mar 2006
    Messages:
    113
    Likes Received:
    20
    Reputations:
    14
    А вот пару примеров, из которых два выше варианта работать не будут:
    217.69.128.44 упал на 10 сек, а в этот момент была проверка
    Траблы с маршрутизацией, BGP такое дело
    И снова коннект на 80 порт, это не разумно проверять конект на веб-сервер
     
    #6 lo0, 29 Dec 2009
    Last edited: 29 Dec 2009
  7. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    tracert до отрезолвленного msn.com
    условие присутствия интернета это ответ следующего за вашим гейта!

    ... хотя можно и пингануть гейт провайдера!

    Интернет - это не америка не корневые ДНС сервера!
    Интернет -это среда переноса информации!
     
  8. lo0

    lo0 Elder - Старейшина

    Joined:
    6 Mar 2006
    Messages:
    113
    Likes Received:
    20
    Reputations:
    14
    А кокой гейт-то пинговать? У меня 4 канала(BGP)
     
  9. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    ну свой гейт комп знает ....поэтому в логике я и писал трейсерт (icmp c временем жизни +1 от времени TTL при котором ответил свой гейт)
     
    1 person likes this.
  10. lo0

    lo0 Elder - Старейшина

    Joined:
    6 Mar 2006
    Messages:
    113
    Likes Received:
    20
    Reputations:
    14
    Retimiled, согласен!

    PS: Осталось реализовать на с++
     
  11. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,032
    Likes Received:
    1,320
    Reputations:
    327
    хахах, так тоже и с гейтом может быть. на мой вкус - выбрать например Х белых статических ип и действовать в соответствии что пингуется по меньшей мере один из них и все. к томуже - пинг многие экраны закрывают, поэтому самое надежное - пробовать установить связь с веб-интерфейсом
     
  12. Retimiled

    Retimiled Banned

    Joined:
    23 Dec 2009
    Messages:
    110
    Likes Received:
    17
    Reputations:
    0
    Нет пинг со стороны .... adsl модема ,media("оптического") маршрутизатора закрыть провайдер не может .... если не обновятся arp таблицы то и связи не будет между вашим гейтом и гейтом провайдера ни какая IOS не поможет !

    Пинг по условию должен править(обновлять) arp таблицы.... поэтому найдите мне того кто сидит в инете и у кого не пингуется дефаулт гейт провайдера и я возьму слова обратно! :D

    даже если пинг не отвечает ....
    модем делает пинг, перед этим
    модем(маршрутизатор просматривает arp таблицу)
    и если нет записи для гейта .... делает arp запрос и получает arp ответ от маршрутизатора провайдера!
    далее следует ICMP итд....

    ПИНГ - инициатор ARP ЗАПРОСА!

    ... конечно я понимаю что есть уровень юзера , дак у юзера я могу зарубить что угодно 8))...

    ... дайте мне юзверя и я ему обрежу хоть яйца хоть уши! 8))
     
    #12 Retimiled, 29 Dec 2009
    Last edited: 29 Dec 2009
  13. lo0

    lo0 Elder - Старейшина

    Joined:
    6 Mar 2006
    Messages:
    113
    Likes Received:
    20
    Reputations:
    14
    А можно посмотреть на эту доку, плиз?
    С нормальными роутерами такого не бывает! А у провайдеров верхнего уровня хорошие роутеры, можно не волноваться ;)