Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Как опредилить подключён ли пользователь к инету


Автор: fuckerok 8.11.2004, 08:49
Хочу написать программу примерно следушего типа.....

Если пользователь подключён к инету, то программа выполняет какю либо процедуру, если же юзер не подключён, то программа ожидает пока он не подключиться (допустим каждые пять мин опять проверяеть состояние конекта).
Нашёл несколько способов в делфи ворд, но что-то не один из них не работает smile

Конечно можно было сделать проверять ИП, если не 127.0.0.1, то значит юзер подключён, но тут возникает вопрос куда? мОжет локалка у него, а моя прога будет обращаться к серверу отправки почты майла.рю smile
По этому прошу написать пример определения конекта именно к инету! smile

Автор: oleg1973 8.11.2004, 11:35
в АПИ есть
GetInetConnectionStatus
или народный способ пингануть ченить
или попытатся сделать gethostbyname

Автор: p0s0l 8.11.2004, 11:39
Проверяй, есть ли соединение с каким-нибудь хостом...
В принципе, можно сделать просто перевод DNS-имени в IP-адрес какого-нибудь "microsoft.com" - этого думаю будет достаточно.
Типа такого:
Код
function IsInetConnected : boolean;
var
 wsa : TWSAData;
begin
 WSAStartup ($0202, wsa);
 Result := gethostbyname('microsoft.com') <> nil;
 WSACleanup;
end;

Добавлено @ 11:40
oleg1973 меня опередил smile

Автор: SoWa 9.11.2004, 12:04
if InternetGetConnectedState(nil,0) then //Если подключен, то...
begin
...
end;

Автор: Vit 9.11.2004, 16:56
FAQ!

Автор: fuckerok 17.11.2004, 07:02
Вот ещё в код забыли вы добавить
Код

Uses WinSock;

Без этого не работает, а не все про это помнят smile

Автор: AriX 20.11.2004, 17:23
ИМХО самый верный способ проверки соединения с инетом - это запрос на какой-нибудь сайт, который 99,9% в сети (типа microsoft.com, hotmail.com, mail.ru итд).
Таким способом, можно проверять соединение и через проксик.
Вот как это примерно делается:
Код
function CheckConnection: boolean;
begin
 Result := true;
 if Settings.ProxyParams.Use then // Если соединятся через проксик...
   with httpCheckConnection.ProxyParams do begin // httpCheckConnection - это TIdHttp - можно кинуть на форму, можно сделать внутри функции
     ProxyServer := Settings.ProxyParams.Server;
     ProxyPort := StrToInt(Settings.ProxyParams.Port);
     ProxyUsername := Settings.ProxyParams.Username;
     ProxyPassword := Settings.ProxyParams.Password;
   end;
 try
   httpCheckConnection.Head('http://microsoft.com/');
 except
   on EIdReadTimeout do begin // По таймауту обрабатываем исключение
     // Здесь пишем что-нибудь типа Application.MessageBox('No connection', 'Error', MB_ICONERROR);
     Result := false;
   end;
 end;
end;

У меня сделано примерно так. Можно конечно доработать, но принцип я думаю ясен smile

p0s0l
Цитата
В принципе, можно сделать просто перевод DNS-имени в IP-адрес какого-нибудь "microsoft.com" - этого думаю будет достаточно.

Этот способ плох тем, что если человек сидит через проксю, то реально проверить если коннект не получится - до ДНС он может и дотянется, а дальше никуда не вылезет smile

Автор: Vit 23.11.2004, 16:34
Цитата(fuckerok @ 7.11.2004, 23:49)
По этому прошу написать пример определения конекта именно к инету!



Со 100% гарантией задача неразрешима.

Автор: AriX 30.11.2004, 13:57
Vit
А выше написанный способ чем может быть плох - просто самому интересно smile

Автор: Vit 1.12.2004, 05:16
Потому что может стоять например фильтрик который позволяет тебе в инете ходить только на Yahoo - ты по нему проверил инет - есть, а куды не ткнёшься - никуда пойти нельзя. Yahoo или MS или чего ещё может тоже иногда падать... Твой пример на самом деле один из наиболее хороших способов который даёт наиболее точную инфу о возможности выхода в инет, но тоже без 100% гарантии.

Автор: AriX 2.12.2004, 14:53
Vit
А ну если так smile
Согласен, но это уж совсем маловероятно ;)

Автор: oleg1973 2.12.2004, 17:49
ну немнога не согласен
это InternetGetConnectedState окромя TRUE&FALSE еще кучку параметров возвращает
таких как тип соеденения к примеру
RAS PROXY e.t.c

Автор: Akina 2.12.2004, 18:13
пинги и геты - сакс, потому как могут спровоцировать нежелательные побочные эффекты (дозвон, к примеру).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)