![]() |
|
Модераторы: 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 |
|||
|
||||
| v258 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
В продолжение темы. По тестированию на кабеле у одного из моих пользователей. RasConnectionCount корректно определяет отключение от Инета, но возвращает 1 уже при вызове окна подключения удаленного доступа, что уже не есть правильно.
InternetGetConnectedState из WinInet наоборот - корректно определяет подключение, но только в первый раз. После отключения от Инета она так и остается в True (имеется в виду ситуация на том конкретном компе) Есть ли возможность программно заставить ее обновиться или принудительно перевести в False? Вопрос наверняка глупый, но у меня на это ума пока не хватает |
|||
|
||||
| RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 10 Всего: 115 |
Я вобще пользуюсь такой простой функцией
Правда если соединение у клиента поддерживается только через прокси то такая функция отпадает, а кроме таких случаев 100% надёжная.
|
|||
|
||||
| v258 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
Нет, по-крайней мере у меня на модеме этот пример ведет себя неадекватно - при запуске тут же начинают выскакивать окна подключения удаленного доступа, при чем, по одному на каждое срабатывание таймера.
После отключения от Инета картина полностью повторяется. Если же задаю URL без преффикса http:// , то функция постоянно возвращает False |
|||
|
||||
| Girder |
|
|||
![]() Лентяй 2 ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1993 Регистрация: 12.5.2004 Репутация: 4 Всего: 155 |
PS: Да и вообще... может пользователь соединяется не с интернет(провайдером) через модем! Это сообщение отредактировал(а) Girder - 24.7.2005, 17:26 -------------------- Как слышим, так и пишим. Истина где-то там... |
|||
|
||||
| RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 10 Всего: 115 |
Это где-то в настройках виндовс отключается. |
|||
|
||||
| v258 |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
И я даже знаю, где, но это далеко не всех устроит. По крайней мере, меня точно - я привык именно к таким настройкам
На модеме работает, а на выделенке - возвращает 1 уже при вызове окна соединения удаленного доступа (по-крайней мере на одном компе именно так и было) Короче, все эти функции работают более-менее корректно на диалапе, а вот на кабеле возможно все, что угодно |
||||
|
|||||
| RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 10 Всего: 115 |
Тут один деятель накатал программу для проверки коннекта.
Требуются компоненты ICS. Исходник: Присоединённый файл ( Кол-во скачиваний: 19 )
connectioncheck.zip 29,61 Kb |
|||
|
||||
| v258 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
А где их можно взять? |
|||
|
||||
| RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 10 Всего: 115 |
www.overbyte.be
|
|||
|
||||
| v258 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 19.7.2005 Где: Краснодарский кра й Репутация: нет Всего: 2 |
ОК, спасибо
|
|||
|
||||
![]()
|
| Правила форума "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. |