![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| v258 |
|
|||
|
Unregistered |
Я здесь впервые, может быть такая тема уже есть, если да, то извините
Мне интересно, как можно определить, есть ли соединение с Интернет. В частности, как пользоваться функцией InetIsOffLine, импортированной из URL.dll У меня она постоянно выдает, что соединение установлено, хотя это далеко не так У меня WinXP SP2, модем и никакой локалки. Или эта функция используется для чего-то другого? |
|||
|
||||
| RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 10 Всего: 115 |
||||
|
||||
| SoWa |
|
|||
![]() Харекришна ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2422 Регистрация: 18.10.2004 Репутация: 3 Всего: 74 |
Пример:
Это сообщение отредактировал(а) SoWa - 21.7.2005, 08:38 -------------------- Всем добра |
|||
|
||||
| v258 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
ОК, спасибо, а как пользоваться функцией InetIsOffLine, импортированной из URL.dll
Вот такая схема все время выдает, что подключение установлено:
Пример взят из DRKB, но не работает |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 5 Всего: 98 |
что тебе эта InetIsOffline дался ( еще и непонятно откуда взятая )?
используй internetgetconnectedstate -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 4 Всего: 133 |
Как проверить, есть ли соединение с Интернет Введение * * Проблема проверки наличия связи с Интернет известна давно, но красивого решения данной проблемы я не встречал. Отсутствие решения связано с тем, что невозможно дать точное определение, что же такое "соединение с Интернет". Приведу реальный пример - в момент написания данного совета у меня установлено модемное соединение с большой ЛВС предприятия. При этом из ЛВС есть несколько входов в Интернет, организованных через нескольких провайдеров. Пакет от моего ПК до сервера в Интернет идет через десяток шлюзов/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. -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| v258 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
Ситуация такая - есть программа для подсчета времени, проведенного в Интернет, которую я выложил на своем сайте. Судя по откликам пользователей, у тех, у кого подключение через кабель, возникают проблемы с определением соединения. Я опробовал несколько методов:
1. GetHostByName - определение IP-адреса сервера ya.ru (сервер, в принципе, можно выбрать любой) - программа показывает наличие соединения постоянно; 2. InternetGetConnectedState - подключение к Инету определяется корректно, но вот отключение отлавливается по разному - у кого-то через минуту-другую, а у кого-то прога вообще не замечает факта отключения; 3. Ping - не подходит по определению, т.к. увеличивает траффик. Даже если пинговать 5 раз в секунду с отправкой пинга из 128 байт это отзначает 30 kb в минуту и 1800 kb в час исходящего траффика и не менее 1 Mb входящего; кроме того, при сильной загруженности линии пинг может приходить с большим запаздыванием, что тоже не есть хорошо; 4. InetIsOffline - у меня на модеме постоянно показывает, что соединение установлено, даже когда я вообще модем отключаю (код приведен на пару постов выше); на локалке я его не проверял; Все примеры проверялись на кабеле, но не у меня, т.к. я сижу на модеме, и никакой локалки у меня нету, поэтому детальных подробностей тестирования у меня нет. Я хочу сделать в программе возможность выбора способа определения подключения, чтобы пользователь мог выбирать наиболее подходящий для себя, поэтому и пробую разные методы. PS: А существуют ли способы определения отключения от Инета. |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 4 Всего: 133 |
А вообще, если ты пишешь такую прогу, то посмотри вот этот исходник. Много че полезного там найдешь. -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| v258 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
ОК, спасибо, буду посмотреть
|
|||
|
||||
| RaIDeR |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 20.6.2005 Репутация: 1 Всего: 4 |
По моему самый простой способ - это пинговать яндекс или ещё чего
|
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 4 Всего: 133 |
http://vingrad.ru/DELPHI-DLP-001377 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| v258 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
Это есть в DRKB. По поводу InternetGetConnectedState и InetIsOffLine я писал выше, а вот в коде последнего примера мне кое-что не до конца понятно. В частности, функция RasConnectionCount будет ли работать на выделенке или же только на диалапе? Сам проверить не могу |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 4 Всего: 133 |
RasConnectionCount вернула 1 ConnectedToInternet вернула ctDialup (что меня удивило) -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| v258 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
Да уж, действительно смешно |
|||
|
||||
| v258 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
А если разобраться, то и странного ничего нет - там всего три варианта - ctNone, ctProxy и ctDialup |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |