Программирование на Delphi - обмен опытом / Как проверить, есть ли соединение с Интернет

© Зайцев Олег 1998-2004
Лучшая портативная техника. Плееры Камеры Телефоны Компьютеры
Покупателям, пришедшим на www.porta.ru по этой ссылке - дополнительная скидка 1%
Железо | Система | WEB | Компоненты | Графика | Ссылки | Мультимедиа | Сети | Прочее | Реестр | Литература

Статистика

Как проверить, есть ли соединение с Интернет

Рекомендую:
Главная страница \ Сети \ Как проверить, есть ли соединение с Интернет

  • Как проверить, есть ли соединение с Интернет

    Как проверить, есть ли соединение с Интернет

    Введение * * Задать вопрос Наверх
    Проблема проверки наличия связи с Интернет известна давно, но красивого решения данной проблемы я не встречал. Отсутствие решения связано с тем, что невозможно дать точное определение, что же такое "соединение с Интернет". Приведу реальный пример - в момент написания данного совета у меня установлено модемное соединение с большой ЛВС предприятия. При этом из ЛВС есть несколько входов в Интернет, организованных через нескольких провайдеров. Пакет от моего ПК до сервера в Интернет идет через десяток шлюзов/firewall/маршрутизаторов в нашей ЛВС, проходит через прокси-сервер, NAT транслятор и т.п. - где гарантия исправности всей цепочки и того, мой пакет будет пропущен до пункта назначения (и где гарантия того, что будет пропущен ответ). Но при этом у меня активно модемное соединение, моему ПК присвоен IP адрес и все описанные далее функции бодро рапортуют о наличие связи.
    Или еще пример - установлена связь с провайдером Интернет и повис модем - функции проверки покажут, что соединение есть ....
    Следовательно, я хочу сформулировать вывод: Бессмысленно анализировать факт наличия некоего абстрактного "соединение с Интернет" - нужно пробовать выполнить заданную операцию и анализировать успешность ее выполнения. Или, перефразируя вышесказанное, наличие связи нужно рассматиривать в контексте каждого конретного сервера Интернет для каждой конкретной операции. Инача возможна ситуация, когда, к примеру, сервер отвечает на ping, но доступ к нему по порту 80 закрыт - в данном случае даже ping не является показателем наличия связи и доступности сервера

    Метод на основе InetIsOffline * * Задать вопрос Наверх
    Функция InetIsOffline не декларирована в Delphi и это неоходимо сделать вручную:

     function InetIsOffline(Flag: Integer): Boolean; stdcall; external 'URL.DLL'
    
    Функция возращает true, если существует соединение с Internet и false при остутствии соединения.

    Метод на основе InternetGetConnectedState * * Задать вопрос Наверх
    Функция InternetGetConnectedState библиотеки wininet.dll прозволяет проверить наличие соединения с Интернет

    const  
     INTERNET_CONNECTION_MODEM      = 1;  
     INTERNET_CONNECTION_LAN        = 2;  
     INTERNET_CONNECTION_PROXY      = 4;  
     INTERNET_CONNECTION_MODEM_BUSY = 8;
    
    function InternetGetConnectedState(lpdwFlags: LPDWORD; dwReserved:DWORD):BOOL; stdcall; external 'wininet.dll' name 'InternetGetConnectedState';
     .... 
    function IsInternetConnected: Boolean;
    var  
     dwConnectionTypes: DWORD;
    begin 
     dwConnectionTypes := INTERNET_CONNECTION_MODEM or 
                          INTERNET_CONNECTION_LAN or 
                          INTERNET_CONNECTION_PROXY;  
     Result := InternetGetConnectedState(@dwConnectionTypes, 0);
    end;
    

    Метод на основе GetHostByName * * Задать вопрос Наверх
    В совете "Определение IP адреса и имени хоста" описана методика, позволяющая определить IP адрес хоста. Так вот, при отсутстии соединения компьютера с Интернет (вернее поправка - при отсутствии связи с ЛВС) возвращаемый адрес = '127.0.0.1', при наличии - адрес, присвоенный провайдером. Естественно, метод столь-же некорректен и ненадежен, что и остальные ...

    Метод на основе GetSystemMetrics * * Задать вопрос Наверх
    Проверить соединение с Интернет можно при помощи функции API GetSystemMetrics:

    function IsInternetConnected: Boolean;
    begin
     Result := GetSystemMetrics(SM_NETWORK) and 1 > 0;
    end;
    
    Примечание: как и говорилось во введении данного раздела, эта функция проверяет дословно "наличие сети" - вот выдержка из Help: " ....The least significant bit is set if a network is present; ..."


    © Зайцев Олег, "Программирование на Delphi - обмен опытом" 1999-2004. При использовании любых материалов данного сайта необходимо указывать источник информации. Дата обновления: 22.11.2004. Сайт размещен на хостинге AGAVA - Хостинг от AGAVA.ru