Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdIcmpClient für einen ping (https://www.delphipraxis.net/134039-idicmpclient-fuer-einen-ping.html)

64Jabor 14. Mai 2009 14:24


IdIcmpClient für einen ping
 
Liebe DP :wink:

ich habe folgendes Problem:

Ich möchte anhand von IP-Adressen prüfen ob ein Computer - wir setzen mal vorraus das keine Firewall den ping blockiert - online ist (sofern die IP denn auch stimmt).
Ich habe das Forum durchsucht und bin auf die IdIcmpClient-Komponente des Indy-Packages gestoßen.
Die verwende ich folgerndermaßen: ("Ping" ist eine Instanz der TIdIcmpClient)

Delphi-Quellcode:
 Ping.Host := ComputerIP.Caption;
 Ping.Ping();
 if (Ping.ReplyStatus.BytesReceived > 0) then result := TRUE
  else result := FALSE;
Nun erhalte ich jedoch (ich muss sagen dass IMMER der erste Ping in meinem Programm an localhost geht (sinnlos, ich weiß, aber!)
egal welche IP ich angebe - ob das nun xyz oder fff ist - ein Ergebnis das WAHR ist in meiner Funktion die oben beschrieben ist.
Woran liegt denn der Fehler?

mfg Sebi

nahpets 14. Mai 2009 14:33

Re: IdIcmpClient für einen ping
 
Hallo,

zur Erfolgsprüfung solltes Du das entsprechende Ereignis nutzen:
Delphi-Quellcode:
PingReply(ASender: TComponent; const AReplyStatus: TReplyStatus);
Dort kannst Du dann auf Erfolg oder Misserfolg abfragen:
Delphi-Quellcode:
Case AReplyStatus.ReplyStatusType Of
  rsEcho            : Begin
                         sPingLogResult := 'erfolgreich';
                       End;
  rsError           : Begin
                         sPingLogResult := 'Fehler';
                       End;
  rsTimeOut         : Begin
                         sPingLogResult := 'TimeOut';
                       End;
  rsErrorUnreachable : Begin
                         sPingLogResult := 'nicht Erreichbar';
                       End;
  rsErrorTTLExceeded : Begin
                         sPingLogResult := 'TTL überschritten';
                       End;
End;
sPingLogResult sei hier eine global deklarierte Stringvariabel.

64Jabor 14. Mai 2009 14:48

Re: IdIcmpClient für einen ping
 
Hallo,

vielen Dank für deine Antwort!
Ich implementiere meine Funktion in einer eigenen Unit und möchte deshalb wenn möglich alles auch in der Unit halten...
Wenn ich meine Funktion allerdings abändere und so stattdessen den ReplyStatusType abfrage, funktioniert es wunderbar!
Vielen Dank!

Da der Titel ja recht allgemein gehalten ist, denke ich passt eine zweite Frage auch noch zu ihm:

Mittels der IdIcmpClient die ich mit folgender Einstellung betreibe (ReadTimeOut 250), laggt das Programm wenn der Timer meine Komponenten (zur Zeit genau 2) zum Auffruf des Pings auffordert.
Auch eine IdAntiFreeze (ohne Konfiguration -> IdleTimeOut 250) löst dies nicht...
Was kann ich denn da tun?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 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