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
FYI blog.superuser.com/2011/05/16/ windows-7-network-awareness   -  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
Какво ще стане, ако искам да проверя само LAN връзката (кабелът е изключен)? - 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
@ChrisS. Може би, може би не. 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