Как проверить, есть ли соединение с Интернет Как проверить, есть ли соединение с Интернет
Введение |
*
| *
|
| |
Проблема проверки наличия связи с Интернет известна давно, но красивого решения
данной проблемы я не встречал. Отсутствие решения связано с тем, что невозможно дать точное
определение, что же такое "соединение с Интернет". Приведу реальный пример - в момент написания
данного совета у меня установлено модемное соединение с большой ЛВС предприятия. При этом из ЛВС
есть несколько входов в Интернет, организованных через нескольких провайдеров. Пакет от моего ПК до
сервера в Интернет идет через десяток шлюзов/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