Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi [Indy] Pingen (https://www.delphipraxis.net/65198-%5Bindy%5D-pingen.html)

3_of_8 13. Mär 2006 17:15


[Indy] Pingen
 
Morgen. Ich habe einen TIdICMPClient und will jetzt nen Host pingen. Mein bisheriger Code:

icmp.host:='127.0.0.1';
icmp.ping;
with icmp.receive(100) do showmessage(FromIPAddress);

Eigentlich müsste da nach ner Millisekunde ne Messagebox mit '127.0.0.1' kommen. Tuts aber nicht.
Es kommt ne Messagebox mit '0.0.0.0', also ein Ping-Timeout. Und das bei der Loopbackadresse? Beim Localhost? Im cmd mit ping ::1 gehts. ping 127.0.0.1 natürlich auch. Ich kann das Timeout auch auf 10 Sekunden hochschrauben, hilft auch nix.

Seltsamerweise gehts, wenn ich ein OnReply Event definiere und dort die Messagebox ausgeben lasse. Für meine Zwecke ist das aber sehr unpraktisch.

Klaus01 13. Mär 2006 18:29

Re: [Indy] Pingen
 
Wenn man sich den Quellcode vom idcmp anschaut, scheint das so gewollt zu sein:

Delphi-Quellcode:
function TIdIcmpClient.Receive(ATimeOut: Integer): TReplyStatus;
var
  BytesRead : Integer;
  Size : Integer;
  StartTime: Cardinal;
begin
  FillChar(bufReceive, sizeOf(bufReceive),0);
  Size := sizeof(bufReceive);
  StartTime := GetTickCount;
  repeat
    BytesRead := ReceiveBuffer(bufReceive, Size, ATimeOut);
    GStack.CheckForSocketError(BytesRead);
    if DecodeResponse(BytesRead, Result) then
    begin
      break
    end
    else
    begin
      // The received reply wasn't for this request, so make sure we don't
      // report it as such in case we time out after this
      result.BytesReceived  := 0;
      result.FromIpAddress  := '0.0.0.0';   {Do not Localize}  {<----------------------------------------}
      result.MsgType        := 0;
      result.SequenceId     := wSeqNo;
      result.TimeToLive     := 0;
      result.ReplyStatusType := rsTimeOut;

      ATimeOut := Cardinal(ATimeOut) - GetTickDiff(StartTime,getTickCount); // compute new timeout value
    end;
  until ATimeOut <= 0;
end;
Grüße
Klaus

3_of_8 13. Mär 2006 18:35

Re: [Indy] Pingen
 
Ich glaub, ich habs schon gelöst. Ich hab das Receive einfach rausgelassen. Hab den richtigen Code in nem Tut gefunden. Danke.

hatro70 13. Mär 2006 21:30

Re: [Indy] Pingen
 
wäre schön den link zu den tut zu posten oder den code,
ich denke das da andere auch intresse dran haben werden

fLeTCHeR 13. Mär 2006 22:39

Re: [Indy] Pingen
 
jap... das würde mich auch mal interessieren wie du das gelöst hast, bzw. wie das in dem tut gemacht wird.

gruß fLeTCHeR

cruiser 13. Mär 2006 22:49

Re: [Indy] Pingen
 
Über die Auswertung von
Delphi-Quellcode:
const AReplyStatus: TReplyStatus
in
Delphi-Quellcode:
TIdIcmpClient.OnReply

3_of_8 14. Mär 2006 12:49

Re: [Indy] Pingen
 
Nope.

So:

Delphi-Quellcode:
icmp.ping;
showmessage(icmp.replystatus.fromipaddress);
Mal stark vereinfacht.

Guckt mal auf www.dsdt.info unter Tutorials/Indy auf der Seite mit IdICMTClient.

cruiser 14. Mär 2006 20:06

Re: [Indy] Pingen
 
Naja... nur ist das Ereignis genau dafür gedacht, die Rückgabe vom angepingten Server auszuwerten.

3_of_8 14. Mär 2006 21:02

Re: [Indy] Pingen
 
Ja. Aber wenn ich jetzt mehrere Knoten durchpinge ist das mehr als unpraktisch. Beispielsweise bei einem TraceRoute.

cruiser 14. Mär 2006 21:19

Re: [Indy] Pingen
 
In der Fragestellung war davon so aber nicht die Rede... wenn du das in einer while-schleife oder so durchpingst isses effizienter, ja


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