Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Соединение с Интернет, Как определить, есть ли соединение? 
:(
    Опции темы
v258
Дата 19.7.2005, 17:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Я здесь впервые, может быть такая тема уже есть, если да, то извините
Мне интересно, как можно определить, есть ли соединение с Интернет. В частности, как пользоваться функцией InetIsOffLine, импортированной из URL.dll
У меня она постоянно выдает, что соединение установлено, хотя это далеко не так smile
У меня WinXP SP2, модем и никакой локалки.
Или эта функция используется для чего-то другого?
  Вверх
RA
Дата 19.7.2005, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 10
Всего: 115



PM   Вверх
SoWa
Дата 21.7.2005, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 3
Всего: 74



Пример:
Код

if internetgetconnectedstate(nil, 0) then //если подключен, то...


Это сообщение отредактировал(а) SoWa - 21.7.2005, 08:38


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
v258
Дата 21.7.2005, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 19.7.2005
Где: Краснодарский кра й

Репутация: нет
Всего: 2



ОК, спасибо, а как пользоваться функцией InetIsOffLine, импортированной из URL.dll

Вот такая схема все время выдает, что подключение установлено:
Код

function InetIsOffline(Flag: Integer): Boolean; stdcall; external 'URL.DLL'; 

...................... 

if InetIsOffline(0) then 
ShowMessage('This computer is not connected to Internet!') 
else 
ShowMessage('You are connected to Internet!'); 

Пример взят из DRKB, но не работает smile
PM MAIL WWW   Вверх
_hunter
Дата 21.7.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 5
Всего: 98



что тебе эта InetIsOffline дался ( еще и непонятно откуда взятая )?
используй internetgetconnectedstate


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Poseidon
Дата 21.7.2005, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 4
Всего: 133



Цитата(_hunter @ 21.7.2005, 17:57)
что тебе эта InetIsOffline дался ( еще и непонятно откуда взятая )?

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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
v258
Дата 21.7.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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: А существуют ли способы определения отключения от Инета.
PM MAIL WWW   Вверх
Poseidon
Дата 21.7.2005, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 4
Всего: 133



Цитата(v258 @ 21.7.2005, 19:14)
А существуют ли способы определения отключения от Инета.
Вообще способов определения подключения/отключения к/от интернету нет. Винда вроде никакого сообщения не посылает. Существуют функции определения наличия соединения. Они выше. Эти же функции можно использовать и для определения отсутствия подключения.
А вообще, если ты пишешь такую прогу, то посмотри вот этот исходник. Много че полезного там найдешь.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
v258
Дата 21.7.2005, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 19.7.2005
Где: Краснодарский кра й

Репутация: нет
Всего: 2



ОК, спасибо, буду посмотреть smile
PM MAIL WWW   Вверх
RaIDeR
Дата 21.7.2005, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 20.6.2005

Репутация: 1
Всего: 4



По моему самый простой способ - это пинговать яндекс или ещё чего smile
PM MAIL   Вверх
Poseidon
Дата 21.7.2005, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 4
Всего: 133



Цитата(v258 @ 21.7.2005, 20:52)
ОК, спасибо, буду посмотреть
Посмотри еще тут:
http://vingrad.ru/DELPHI-DLP-001377



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
v258
Дата 23.7.2005, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 19.7.2005
Где: Краснодарский кра й

Репутация: нет
Всего: 2



Цитата
Посмотри еще тут:
http://vingrad.ru/DELPHI-DLP-001377

Это есть в DRKB. По поводу InternetGetConnectedState и InetIsOffLine я писал выше, а вот в коде последнего примера мне кое-что не до конца понятно. В частности, функция RasConnectionCount будет ли работать на выделенке или же только на диалапе? Сам проверить не могу smile
PM MAIL WWW   Вверх
Poseidon
Дата 23.7.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 4
Всего: 133



Цитата(v258 @ 23.7.2005, 11:28)
В частности, функция RasConnectionCount будет ли работать на выделенке или же только на диалапе? Сам проверить не могу
Проверил у себя на выделенке. Все работает.
RasConnectionCount вернула 1
ConnectedToInternet вернула ctDialup (что меня удивило)



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
v258
Дата 23.7.2005, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 19.7.2005
Где: Краснодарский кра й

Репутация: нет
Всего: 2



Цитата
ConnectedToInternet вернула ctDialup (что меня удивило)

Да уж, действительно смешно smile Однако, спасибо!!! smile
PM MAIL WWW   Вверх
v258
Дата 23.7.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 19.7.2005
Где: Краснодарский кра й

Репутация: нет
Всего: 2



Цитата
Да уж, действительно смешно

А если разобраться, то и странного ничего нет - там всего три варианта - ctNone, ctProxy и ctDialup
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.