delphi проверить подключение к интернету

Мне нужна работающая функция для Delphi 2010, чтобы проверить, доступно ли подключение к Интернету.

Я говорю работает, потому что до сих пор я пробовал 4 разных метода, например. http://delphi.about.com/b/2005/04/22/how-to-check-for-internet-connection-using-delphi-code.htm, но ни один из них не работал.

Например, один метод всегда выдавал, что есть подключение к интернету, даже когда кабеля не было в компьютере, другой наоборот (всегда говорил, что нет подключения).

     procedure TForm1.Button1Click(Sender: TObject) ;

      function FuncAvail(_dllname, _funcname: string;
                         var _p: pointer): boolean;
      {return True if _funcname exists in _dllname}
      var _lib: tHandle;
      begin
       Result := false;
       if LoadLibrary(PChar(_dllname)) = 0 then exit;
       _lib := GetModuleHandle(PChar(_dllname)) ;
       if _lib <> 0 then begin
        _p := GetProcAddress(_lib, PChar(_funcname)) ;
        if _p <> NIL then Result := true;
       end;
      end;

      {
      Call SHELL32.DLL for Win < Win98
      otherwise call URL.dll
      }
      {button code:}
      var
       InetIsOffline : function(dwFlags: DWORD):
                       BOOL; stdcall;
      begin
       if FuncAvail('URL.DLL', 'InetIsOffline',
                    @InetIsOffline) then
        if InetIsOffLine(0) = true
         then ShowMessage('Not connected')
         else ShowMessage('Connected!') ;
      end;

person starhu    schedule 13.03.2014    source источник
comment
Что именно вы пробовали?   -  person Remy Lebeau    schedule 13.03.2014
comment
Добро пожаловать в StackOverflow. Это не служба написания кода, где вы публикуете свои требования, а затем говорите: «Напишите мне функцию, которая уже протестирована». Я вернусь позже, чтобы забрать его. Спасибо.. Мы будем рады помочь ответить на конкретные вопросы о проблемах с кодом, но для этого вам необходимо опубликовать свой код и описание проблемы, а также задать сначала конкретный вопрос. Если вам нужен писатель кода по запросу, наймите подрядчика или консультанта. Удачи.   -  person Ken White    schedule 13.03.2014
comment
К вашему сведению blog.superuser.com/2011/05/16/ Windows-7-осведомленность о сети   -  person Sir Rufo    schedule 14.03.2014
comment
Извини, что обидел тебя. Я думал, что предоставление действительной ссылки заставит читателя щелкнуть по ней. Я вставил код в свой исходный вопрос, спасибо   -  person starhu    schedule 14.03.2014


Ответы (3)


Добавьте в ваше использование модуль WinNet. Функция InternetGetConnectedState возвращает значение состояния и типа Интернета. Смотри ниже:

function YourFunctionName : boolean;
  var
     origin : cardinal;
  begin
     result := InternetGetConnectedState(@origin,0);

     //connections origins by origin value
     //NO INTERNET CONNECTION              = 0;
     //INTERNET_CONNECTION_MODEM           = 1;
     //INTERNET_CONNECTION_LAN             = 2;
     //INTERNET_CONNECTION_PROXY           = 4;
     //INTERNET_CONNECTION_MODEM_BUSY      = 8;
  end;

обновить в новых версиях Delphi добавлен класс wininet.

person Tiago Nogueira    schedule 14.03.2014
comment
Правильно: использует WinINet - person Andrzej; 06.07.2021

Единственный надежный метод — это попытаться подключиться к реальному серверу где-нибудь в Интернете и посмотреть, получится ли это. Не используйте функции ОС, которые полагаются на информацию о состоянии ОС, поскольку эти данные могут легко рассинхронизироваться.

person Remy Lebeau    schedule 13.03.2014
comment
И нам нужно пойти глубже и изучить определение подключения к Интернету. - person Free Consulting; 14.03.2014
comment
Что делать, если я хочу проверить только подключение к локальной сети (кабель отключен)? - person john_who_is_doe; 22.09.2016
comment
@tdiop посмотрите на API диспетчера сетевых списков. Но учтите, что в настоящее время многие сети являются беспроводными, поэтому кабель может не использоваться. - person Remy Lebeau; 22.09.2016

Вы можете использовать компонент TIdHTTP:

function TMainF.isInternetConnection: Boolean;
begin
  try
    IdHTTP.Get('http://www.svtech.cz');
  except
    on E: Exception do begin
      if not (E is EIdHTTPProtocolException) then begin
        Result := False;
        Exit;
      end;
    end;
  end;
  Result := True;
end;
person user1215722    schedule 26.06.2015
comment
TIdHTTP может дать сбой по многим причинам, связанным либо с сокетом, либо с HTTP. Вам придется проанализировать возникшее исключение, чтобы выяснить, почему оно не удалось. Например, имеет смысл возвращать false при ошибке сокета, но не при ошибке HTTP, поскольку соединение было успешным. - person Remy Lebeau; 22.09.2016
comment
@Remy Lebeau Да, особенно сейчас, когда большинство страниц перешли на HTTPS, и этот фрагмент, скорее всего, не сможет использовать HTTPS как есть. - person Chris S.; 04.02.2019
comment
@КрисС. Может быть, а может и нет. TIdHTTP поддерживает HTTPS, вам просто нужен компонент SSLIOHandler, назначенный свойству TIdHTTP.IOHandler. TIdHTTP может создать для вас SSLIOHandler по умолчанию, но в настоящее время по умолчанию используется только TLS 1.0, от которого веб-сайты начинают отказываться. Чтобы использовать TLS 1.1+, вам нужно будет назначить SSLIOHandler вручную. - person Remy Lebeau; 04.02.2019
comment
Я изменил на 'svtech.czsdfsdfasdfasfdas, результат по-прежнему верный - person FZS; 23.12.2020