Проверка подключения к интернету (C++)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Vladislav, 9 Jul 2011.

  1. Vladislav

    Vladislav New Member

    Joined:
    21 Jun 2011
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток.
    Была подобная тема о Delphi. Отличается, конечно, мало, но проблемы она не решила.
    Итак, собственно, задача - проверить, есть ли соединение с интернетом. До недавнего времени для этой цели пользовал собственную функцию:

    Code:
    bool isConnected ()
    {
        DWORD flags;
    	InternetGetConnectedState( &flags, 0 );
    	if ( (flags & INTERNET_CONNECTION_CONFIGURED) != INTERNET_CONNECTION_CONFIGURED )
    		return 0;
    	return 1;
    }
    
    Для неё (а именно для InternetGetConnectedState) подключается Wininet.lib. Ах да, сама по себе функция InternetGetConnectedState желаемого результата не давала, а именно постоянно, независимо от внешних условий, выдавала то ли наличие подключения, то ли его отсутствие (запамятовал уже), что и заставило писать свою проверку.
    Но, как оказалось на днях, такая проверка работает не для любого типа подключения (у меня всё работает прекрасно [прямое через модем], у знакомого тоже [через локалку], а вот у некой знакомой девушки оно интернет категорически не находило, и объяснить, как у неё осуществляется подключение, она не в состоянии :) ). Как я эту функцию не крутил, лучше не становится.
    Вопрос: может кто-нибудь подскажет, что неправильно в моей реализации либо укажет на рабочую альтернативу? Заранее благодарю.
     
  2. ReL@X

    ReL@X New Member

    Joined:
    1 Jul 2011
    Messages:
    8
    Likes Received:
    1
    Reputations:
    2
    Разве эта функция отличит интернет от например, локалки?
    можно попробовать проверить интернет с помощью gethostbyname()
    ну или гет на google.com :)
     
  3. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    читаем внимательнее msdn: InternetGetConnectedState (особенно замечания) и, может проще тогда воспользоваться альтернативной функцией InternetCheckConnection ?

    отличит и не только от локалки =)

    INTERNET_CONNECTION_LAN
    INTERNET_CONNECTION_MODEM
    INTERNET_CONNECTION_PROXY
    INTERNET_RAS_INSTALLED
     
    #3 alexey-m, 9 Jul 2011
    Last edited: 9 Jul 2011
  4. ReL@X

    ReL@X New Member

    Joined:
    1 Jul 2011
    Messages:
    8
    Likes Received:
    1
    Reputations:
    2
    Проверил ради интереса, вроде нормально работает :)
    Code:
          if (!InternetCheckConnection("http://forum.antichat.ru", FLAG_ICC_FORCE_CONNECTION, 0) )
       MessageBox(0,"Нет связи с сайтом","",MB_OK|MB_ICONERROR);
     else
        MessageBox(0,"есть связь","",MB_OK);
      
     
    #4 ReL@X, 9 Jul 2011
    Last edited: 9 Jul 2011
  5. sn0w

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

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,309
    Reputations:
    327
    думаю проще всего

    BOOL IsOnline()
    {
    return (gethostbyname("microsoft.com") != NULL);
    }

    но есть подводные камни. например к сети прова есть подключение и днс запросы он пропускает, а для реального серфа нужен впн коннект.

    можно заюзаьт IcmpSendEcho, в мздн все есть
     
    #5 sn0w, 9 Jul 2011
    Last edited: 9 Jul 2011
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    http://msdn.microsoft.com/en-us/library/bb776460%28v=VS.85%29.aspx
     
  7. Vladislav

    Vladislav New Member

    Joined:
    21 Jun 2011
    Messages:
    10
    Likes Received:
    0
    Reputations:
    0
    В прошлый раз эта же ф-ция (InternetCheckConnection) всегда выдавала false. Походу, где-то налажал в параметрах, ибо щас всё работает. Премного благодарю.
    Окончательный вариант функции:
    Code:
    bool isConnected ()
    {
    	if ( !InternetCheckConnection( "http://google.com", FLAG_ICC_FORCE_CONNECTION, 0) )
    		return 0;
    	return 1;
    }