Avatar billede netjay Nybegynder
16. august 2003 - 16:25 Der er 20 kommentarer og
1 løsning

Kontroller om pc er online

Hej eksperter.

Jeg er ved at lave et lille prg, som skal kunne give en advarsel, hvis internettet bliver afbrudt. Jeg har forsøgt lidt med en TWebBrowser, men kan ikke rigtigt finde det jeg skal bruge.

Jeg har lavet en timer med interval på 50000. Hver gang skal den lave en slags if UrlExists('http://domain.dk/image1.gif')=false then ShowMessage('Internettet er afbrudt');

Ved nogen, hvordan man nemmest og rigtigst kan lave dette?

/NetJay
Avatar billede Slettet bruger
16. august 2003 - 16:28 #1
uses wininet;

function InternetConnected: Boolean;
CONST
  INTERNET_CONNECTION_MODEM      = 1;
  INTERNET_CONNECTION_LAN        = 2;
  INTERNET_CONNECTION_PROXY      = 4;
  INTERNET_CONNECTION_MODEM_BUSY = 8;
var
  dwConnectionTypes : DWORD;
begin
  dwConnectionTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY;
  Result := InternetGetConnectedState(@dwConnectionTypes,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if InternetConnected = true then
begin
Label1.Caption:='Du er på.';
end
else
begin
Label1.Caption:='Du er ikke på.';
end;
end;
Avatar billede Slettet bruger
16. august 2003 - 16:33 #2
Avatar billede athlon-pascal Juniormester
16. august 2003 - 17:55 #3
I stedet for
if InternetConnected = true then
kan du bare skrive
if InternetConnected then
Avatar billede netjay Nybegynder
16. august 2003 - 19:33 #4
hmm... jeg kan ikke rigtigt få det til at virke. kan det have noget at gøre med, at jeg benytter 2 netkort? - Kan man ikke istedet lave en direkte kontrol efter, og systemet kan finde en bestemt fil såsom www.netjay.dk/images/warning.gif
Avatar billede netjay Nybegynder
16. august 2003 - 19:33 #5
den siger jeg er connected selvom jeg hiver kabelmodemmet fra
Avatar billede athlon-pascal Juniormester
16. august 2003 - 19:46 #6
uses
  WinInet;

function IsConnectedToInternet: Boolean;
var
  dwConnectionTypes: DWORD;
begin
  dwConnectionTypes :=
    INTERNET_CONNECTION_MODEM +
    INTERNET_CONNECTION_LAN +
    INTERNET_CONNECTION_PROXY;
  Result := InternetGetConnectedState(@dwConnectionTypes, 0);
end;

Den kode virker hos mig... ADSL...
Avatar billede athlon-pascal Juniormester
16. august 2003 - 19:49 #7
Prøv med en timer med et interval på 1000 :-)
Avatar billede netjay Nybegynder
16. august 2003 - 19:51 #8
den bliver ved med at sige jeg er online selvom jeg hiver netkablet ud
Avatar billede athlon-pascal Juniormester
16. august 2003 - 19:53 #9
Og du har prøvet at sætte timerens interval til 1000?
Avatar billede netjay Nybegynder
16. august 2003 - 19:54 #10
ja, jeg har også lavet en knap til manuelt forsøg
Avatar billede athlon-pascal Juniormester
16. august 2003 - 19:55 #11
Hmm... hvor længe lod du net-stikket være ude?
Avatar billede netjay Nybegynder
16. august 2003 - 19:57 #12
et par min... prøver lige igen i længere tid. Kunne godt tænke mig, at den kontrollerede en direkte URL, så funktionen samtidig kunne kontrollere om eens side var gået ned...
Avatar billede athlon-pascal Juniormester
16. august 2003 - 19:59 #13
Avatar billede athlon-pascal Juniormester
16. august 2003 - 20:01 #14
http://www.swissdelphicenter.com/en/showcode.php?id=70, måske. Ligner dog noget af det du allerede har prøvet...
Avatar billede Slettet bruger
16. august 2003 - 20:15 #15
Måske virker det vist du fjerner INTERNET_CONNECTION_LAN:

function IsConnectedToInternet: Boolean;
var
  dwConnectionTypes: DWORD;
begin
  dwConnectionTypes :=
    INTERNET_CONNECTION_MODEM +
    INTERNET_CONNECTION_PROXY;
  Result := InternetGetConnectedState(@dwConnectionTypes, 0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsConnectedToInternet then
    ShowMessage('Connected.')
  else
    ShowMessage('Not Connected.')
end;
Avatar billede netjay Nybegynder
16. august 2003 - 20:22 #16
nej den siger stadig online... vil prøve at satse på ping...
Avatar billede borrisholt Novice
17. august 2003 - 06:45 #17
1)

Kopier og gem den følgende unit :

interface
uses
  Classes, Sysutils, IdIcmpClient, IdAntiFreeze, IdHTTP;

type
  TDNSResolver = class
  private
    FTarget: string;
    FTraceList: TStringList;
    FMaxHops: Integer;
    FTraceLog: TStringList;
    ResolvedHost: string;
    IdIcmpClient: TIdIcmpClient;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure SetTarget(const Value: string);
    procedure SetMaxHops(const Value: Integer);
    procedure Trace;
  public
    constructor Create;
    destructor Destroy; override;
    function Execute: Boolean;
    function PingHost(Host: string; TTL: Integer): Boolean;
  published
    property Target: string read FTarget write SetTarget;
    property TraceList: TStringList read FTraceList;
    property TraceLog: TStringList read FTraceLog;
    property MaxHops: Integer read FMaxHops write SetMaxHops default 30;
  end;

  THttpCheckSum = class
  private
    FTarget: string;
    procedure SetTarget(const Value: string);
  public
    function Execute: string;
    property Target: string read FTarget write SetTarget;
  end;

implementation
uses
  idStack, IdException, MD5;

{ TDNSResolver }

constructor TDNSResolver.Create;
begin
  inherited;
  FTraceList := TStringList.Create;
  FTraceLog := TStringList.Create;
  FMaxHops := 30;
  FTarget := ''; //localhost
  IdIcmpClient := TIdIcmpClient.Create(nil);
  IdAntiFreeze1 := TIdAntiFreeze.Create(nil);
end;

destructor TDNSResolver.Destroy;
begin
  FreeAndNil(FTraceList);
  FreeAndNil(FTraceLog);
  FreeAndNil(IdIcmpClient);
  FreeAndNil(IdAntiFreeze1);
  inherited;
end;

function TDNSResolver.Execute: Boolean;
begin
  Result := False;
  FTraceList.Clear;
  FTraceLog.Clear;

  FTraceLog.Add(Format('resolving %s', [Target]));
  try
    ResolvedHost := gStack.WSGetHostByName(Target);
    Result := True;
    FTraceLog.Add(format('%s resolved to %s', [Target, ResolvedHost]));
  except
    on e: EIdSocketError do
      FTraceLog.Text := FTraceLog.Text + e.message;
  end;

  if Result then
  begin
    PingHost(ResolvedHost, MaxHops);
    Trace;
  end;
end;

function TDNSResolver.PingHost(Host: string; TTL: Integer): Boolean;
begin
  Result := False;

  FTraceLog.Add(Format('Ping %s', [Host]));

  IdIcmpClient.Host := Host;
  IdIcmpClient.TTL := TTL;
  IdIcmpClient.ReceiveTimeout := 5000;
  IdIcmpClient.Ping;
  with IdIcmpClient, ReplyStatus do
    case IdIcmpClient.ReplyStatus.ReplyStatusType of
      rsEcho:
        begin
          FTraceLog.Add(Format('response from host %s in %d millisec.', [FromIpAddress, MsRoundTripTime]));
          Result := True;
        end;
      rsError:
        FTraceLog.Add('Unknown error.');
      rsTimeOut:
        FTraceLog.Add('Timed out.');
      rsErrorUnreachable:
        FTraceLog.Add(format('Host %s reports destination network unreachable.', [FromIpAddress]));
      rsErrorTTLExceeded:
        FTraceLog.Add(format('Hope %d %s: TTL expired.', [TTL, FromIpAddress]));
    end; // case
end;

procedure TDNSResolver.SetMaxHops(const Value: Integer);
begin
  FMaxHops := Value;
end;

procedure TDNSResolver.SetTarget(const Value: string);
begin
  FTarget := Value;
end;

procedure TDNSResolver.Trace;
var
  TTL: Integer;
  Reached: Boolean;
  aItem: string;
begin
  TTL := 0;
  reached := False;
  FTraceList.Clear;
  repeat
    inc(TTL);
    IdIcmpClient.Host := ResolvedHost;
    IdIcmpClient.TTL := TTL;
    IdIcmpClient.ReceiveTimeout := 5000;
    IdIcmpClient.Ping;
    aItem := '';
    case IdIcmpClient.ReplyStatus.ReplyStatusType of
      rsEcho:
        begin
          aItem := IdIcmpClient.ReplyStatus.FromIpAddress + #9 + format('Reached in : %d ms', [IdIcmpClient.ReplyStatus.MsRoundTripTime]);
          reached := True;
        end;
      rsError:
        begin
          aItem := IdIcmpClient.ReplyStatus.FromIpAddress + #9 + 'Unknown error.';
        end;
      rsTimeOut:
        begin
          aItem := '?.?.?.?'#9'Timed out.';
        end;
      rsErrorUnreachable:
        begin
          aItem := IdIcmpClient.ReplyStatus.FromIpAddress + #9 + format('Destination network unreachable', [IdIcmpClient.ReplyStatus.MsRoundTripTime]);
          break;
        end;
      rsErrorTTLExceeded:
        begin
          aItem := IdIcmpClient.ReplyStatus.FromIpAddress + #9 + format('TTL=%d', [IdIcmpClient.ReplyStatus.TimeToLive]);
        end;
    end; // case
    FTraceList.Add(IntToStr(TTL) + #9 + aItem);
  until reached or (TTL > MaxHops);
end;

{ THttpCheckSum }

function THttpCheckSum.Execute: string;
begin
  with TIdHTTP.Create(nil) do
  try
    Result := StrMd5(Get(Target));
  finally
    free;
  end;
end;

procedure THttpCheckSum.SetTarget(const Value: string);
begin
  if not SameText(copy(Value, 1,  7), 'http://') then
    FTarget := 'http://' + Value
  else
    FTarget := Value;
end;

end.



2)
Smid en knap, et Edit felt (EditIP), og et Memo på din form.
3)
  Prøv så det her :
  with TDNSResolver.Create do
  try
    Target := EditIP.Text;
    Execute;
    Memo1.Text := ' === Trace Log === ';
    Memo1.Lines.AddStrings(TraceLog);
    Memo1.Lines.Add('');
    Memo1.Lines.Add(' === Trace List ===');
    Memo1.Lines.AddStrings(TraceList);
  finally
    free;
  end;

Jens B
Avatar billede netjay Nybegynder
17. august 2003 - 17:44 #18
Hej borrisholt.

jeg får fejlen : Error in Unit1 - Declaration of class TForm1 is missing or incorrect, men efter at have prøvet lidt, kan jeg se, at den mangler MD5.dcu. Hvis du gider, må du gerne maile mig et eksempel på netjay@get2net.dk
Avatar billede borrisholt Novice
18. august 2003 - 08:13 #19
Nej jeg vil heller stille eksemplet til rådighed for alle :-)

http://Borrisholt.com/Eksperten/DNS.zip

Jens B
Avatar billede borrisholt Novice
18. august 2003 - 08:14 #20
THttpCheckSum skal du som ikke bruge i den her sammenhæng. Den er lavet til at checke on en side ændere sig !

Jens B
Avatar billede netjay Nybegynder
18. august 2003 - 15:21 #21
Ja, det er også meget bedre, når man har en side, at lægge det ud på :)
...Men dit eksempel kan lige nøjagtig det jeg søger,
så jeg takker mange gange.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester