Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Fehlerbeseitigung von PING-Fehlern (https://www.delphipraxis.net/38717-fehlerbeseitigung-von-ping-fehlern.html)

Bluemeus 23. Jan 2005 12:17


Fehlerbeseitigung von PING-Fehlern
 
Hallo,

ich habe die Indy-ICMP-Komponente verwendet um pings zu senden. dies klappt auch ohne probleme, aber ich erhalte nach Pingfehlern(aber auch erst nach 10 oder mehr fehlversuchen) eine MsgBox in dem ein SocketError steht.

Könte mir jmd. verraten, wie ich diese fehlermeldung abfangen bzw. gar nicht erst anzeigen lassen kann?


MfG Blue

Dani 23. Jan 2005 12:50

Re: Fehlerbeseitigung von PING-Fehlern
 
Hi,

Indys lösen bei Fehlern Delphi-Referenz durchsuchenExceptions aus. Die kannst du mit einem try...except Block abfangen.

Delphi-Quellcode:
begin
  //Pseudocode
  IdPing1.Host := 'www.delphipraxis.net';
  try
   IdPing1.DoPing;
  except
   //Dieser Code wird ausgeführt wenn der Ping fehlschlägt
   On E: Exception do
    begin
     If E is ESocketError then HandleSocketError
      else UnhandledError;
    end;
  end;
end;

Bluemeus 23. Jan 2005 12:56

Re: Fehlerbeseitigung von PING-Fehlern
 
DANKE!!! :-D (für die SUPERSCHNELLE AW!!! :thumb: )


aber da wäre noch was ... ich find leider per suche nix darüber.

problematisch ist, dass bei fehlschlagendem ping die anwendung freezed. die freezetime scheint dabei dem timeout zu entsprechen, welches bei 3 ping-versuchen 1500 ms beträgt.

Wie kann ich den Ping in einen neuen thread lagern?! :gruebel:

Dani 23. Jan 2005 13:31

Re: Fehlerbeseitigung von PING-Fehlern
 
Du musst in deinem Thread-Objekt eigentlich nur eine neue Instanz von TIdPing (heißt es so?) anlegen.

Delphi-Quellcode:
type
  TPingOnceThread = class(TThread)
   private
    Pinger: TIdPing;
    FFinished: Boolean;
    FHostReachable: Boolean;
    FPingTime: Integer;
   public
    procedure Execute; override;
    constructor Create(HostAddr: String; CreateSuspended: Boolean = false);
    destructor Destroy; override;
   published
     property Finished: Boolean read FFinished default false;
     property HostReachable: Boolean read FHostReachable default false;
     property PingTime: Integer read FPingTime default -1;
   end;

implementation


constructor TPingOnceThread.Create(HostAddr: String; CreateSuspended: Boolean = false);
begin
  inherited Create(true);
  FreeOnTerminate := false;
  Pinger := TIdPing.Create;
  Pinger.Host := HostAddr;
  If not CreateSuspended then Resume;
end;

destructor TPingOnceThread.Destroy;
begin
  Pinger.Free;
end;

procedure TPingOnceThread.Execute;
begin
 try
  FPingTime := Pinger.DoPing; //angenommen die Methode DoPing liefert das Ergebnis
  FHostReachable := true;
 except
  {Exception behandeln oder ignorieren}
 end;
 FFinished := true;
end;
Alle Angaben ohne Gewähr :mrgreen:

Bluemeus 25. Jan 2005 18:05

Re: Fehlerbeseitigung von PING-Fehlern
 
Ich muss da Problem neu aufrollen ...

ich hatte den ersten SC nicht getestet. und ich muss sagen, er funzt nicht! Er findet weder ESocketError noch HandleSocketError...

nunja ... ich poste mal den SC in der Hoffnung jmd kann mir helfen!

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ...
  IdIcmpClient, IdBaseComponent,
  IdComponent, IdRawBase, IdRawClient, IdException, ... ;

...

begin

  { --- Alle xx Sekunden einen Ping senden um auf eine Internetverbindung zu prüfen --- }
   try
    pinger.Ping('a');
   except
    On E: Exception do
     if E Is IDException.EIdSocketError then
       begin
         Showmessage('SOCKETERROR');
       end
     else Showmessage('ELSE')
   end;
end;

So weit geht es, aber mir ist es nicht möglich, den Fehler "SocketError #10011" (glaube ich war es) abzufangen ... :spin2:

MfG bLuE :gruebel:

Bluemeus 30. Jan 2005 18:05

Re: Fehlerbeseitigung von PING-Fehlern
 
Kann mir den niemand sagen, wie ich die exception abfangen kann? :pale:

Dani 30. Jan 2005 23:32

Re: Fehlerbeseitigung von PING-Fehlern
 
Hi,
Ich seh da kein Problem... dieser Code funktioniert bei mir wie erwartet:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 ICMP.Host := 'www.delphipraXXXXXXXXis.de';
 try
  ICMP.Ping('Delphi');
  Memo1.Text := 'Ping: ' + IntToStr(ICMP.ReplyStatus.MsRoundTripTime);
 except
  On E: Exception do
   Memo1.Text := E.ClassName + #13#10
                + E.Message;
 end;
end;
Nur wenn das Programm in der IDE ausgeführt wird, erscheint der Exception-Dialog noch. Das Verhalten der IDE bei Exceptions kann man in D6 unter Hauptmenü => Tools => Debugger-Optionen ändern.

Bluemeus 2. Feb 2005 17:08

Re: Fehlerbeseitigung von PING-Fehlern
 
Danke, dass war die Lösung ... hatte nur icht gechecked, dass der error da,it gehandled wird ... dacht man beötigt dieses HandleSocket ...


Danke!

Zitat:

Zitat von Dani
Hi,
Ich seh da kein Problem... dieser Code funktioniert bei mir wie erwartet:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 ICMP.Host := 'www.delphipraXXXXXXXXis.de';
 try
  ICMP.Ping('Delphi');
  Memo1.Text := 'Ping: ' + IntToStr(ICMP.ReplyStatus.MsRoundTripTime);
 except
  On E: Exception do
   Memo1.Text := E.ClassName + #13#10
                + E.Message;
 end;
end;
Nur wenn das Programm in der IDE ausgeführt wird, erscheint der Exception-Dialog noch. Das Verhalten der IDE bei Exceptions kann man in D6 unter Hauptmenü => Tools => Debugger-Optionen ändern.



Alle Zeitangaben in WEZ +1. Es ist jetzt 14:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz