AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi ping in Delphi ausführen

ping in Delphi ausführen

Ein Thema von fakerer · begonnen am 6. Nov 2002 · letzter Beitrag vom 7. Jul 2004
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von flomei
flomei

Registriert seit: 17. Jan 2003
Ort: Schieder-Schwalenberg
2.094 Beiträge
 
Delphi 2005 Personal
 
#11
  Alt 16. Mai 2003, 18:56
Könnte man mit ShellExecute nicht vielleicht den Windoof Ping ausführen, ihm die IP übergeben und dann kriegt man die Rückmeldung wieder in dein Programm? Das wäre eine Alternative.

MfG Florian
Florian Meier
... ist raus.
Vielen Dank für die Zeit mit euch!
http://www.flomei.de -- http://www.md5hash.de
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.262 Beiträge
 
Delphi 2006 Professional
 
#12
  Alt 16. Mai 2003, 21:39
Moin Masterle,

erst einmal herzlich willkommen in der Delphi-PRAXiS.

Ich hatte da mal etwas "gebastelt" für einen Ping "zu Fuss"

Erst mal die Deklarationen

Delphi-Quellcode:
type
  IPAddr = DWORD;

  PICMP_ECHO_REPLY = ^ICMP_ECHO_REPLY;
  ICMP_ECHO_REPLY = packed record
    Address : ULONG;
    Status : ULONG;
    RoundTripTime : ULONG;
    DataSize : WORD;
    Reserved : WORD;
    Data : Pointer;
  end;

  PIP_OPTION_INFORMATION = ^IP_OPTION_INFORMATION;
  IP_OPTION_INFORMATION = packed record
    Ttl : byte;
    Tos : byte;
    Flags : byte;
    OptionsSize : byte;
    OptionsData : Pointer;
  end;


  function IcmpCreateFile : DWORD; stdcall; external 'icmp.dll';
  function IcmpCloseHandle(const IcmpHandle : DWORD) : longbool; stdcall; external 'icmp.dll';
  function IcmpSendEcho(const IcmpHandle : DWORD;const DestinationAddress : IPAddr;const RequestData : Pointer;const RequestSize : WORD;const RequestOptions : PIP_OPTION_INFORMATION;const ReplyBuffer : Pointer;const ReplySize : DWORD;const TimeOut : DWORD) : DWORD; stdcall; external 'icmp.dll';
Und so der Aufruf:

Delphi-Quellcode:
var
  hICMP : DWORD;
  pierWork : PICMP_ECHO_REPLY;
  dwSize : DWORD;

begin
  hICMP := IcmpCreateFile;
  if hICMP = INVALID_HANDLE_VALUE then exit;
  try
    dwSize := SizeOf(ICMP_ECHO_REPLY)+8;
    pierWork := AllocMem(dwSize);
    try
      if IcmpSendEcho(hICMP,MAKELONG(MAKEWORD(192, 168),MAKEWORD(1, 1)),nil,0,nil,pierWork,dwSize,1000) = 0 then
      begin
        ShowMessage('Nicht gefunden');
      end
      else
      begin
        ShowMessage('Gefunden');
      end;
    finally
      FreeMem(pierWork,dwSize);
    end;
  finally
    IcmpCloseHandle(hIcmp);
  end;
end;
Das alles ist auch im aktuellen PSDK nicht sonderlich gut dokumentiert, ausserdem fehlt (zumindest bei mir) auch die entsprechende icmp.h Datei. Die Doku im MSDN ist etwas besser.
Was dabei noch wichtig wäre:
Angeblich gibt es diese Funktionen erst ab Windows 2000, allerdings vermute ich mal, dass dies nur dabei steht, weil erst aber dieser Windows Version die Funktionen dokumentiert wurden. Wenn ich mich recht entsinne, existieren die Funktionen mindestens sein NT 4.0.

Ob diese Art des Aufrufes wirklich der Weisheit letzter Schluss sind weiss ich nicht, aber bislang hat's so funktioniert.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von nTE
nTE

Registriert seit: 8. Sep 2003
60 Beiträge
 
#13

Re: ping in Delphi ausführen

  Alt 9. Sep 2003, 00:33
Ich bin neu hier und das ist mein erster Eintrag also:
Hallo erstmal!

So, nun aber zum Problem.

Ich habe vor drei Hostnamen nacheinander anzupingen. Allerdings habe ich folgendes Problem:
Wenn ich die Pings direkt hintereinander mache, kommt es dazu, dass die Funktion Ping false liefert und das obwohl alle 3 Server erreichbar sind.
Warte ich nun eine gewisse Weile zwischen den Pings (z.B. 1,5 Sekunden) geht alles glatt.
Ich möchte aber nicht zwangläufig diese Pflichtwartezeit zwischen den Pings haben, sondern, sobald der Ping erfolgreich (oder auch nicht) war, den nächsten ausführen.
Es wäre nett, wenn mir da jemand helfen könnte und ich habe mit Absicht in diesem Thread geschrieben, da ich keine Indy-Ping Geschichte anstrebe sondern eben IcmpSendEcho.

Das Debuggen gestaltet sich für mich als sehr schwer, da im Einzelschrittmodus natürlich alles glatt läuft, da jeder Server seine Zeit bekommt um zu antworten (meiner Meinung nach liegt das Problem darin, dass sich die Pings "überlappen").


Der Source der Funktion Ping:
(TranslateStringToTInAddr dient freilich zur Namesauflösung)

Delphi-Quellcode:
function Ping(InetAddress : string) : boolean;
var
 Handle : THandle;
 InAddr : IPAddr;
 DW : DWORD;
 rep : array[1..128] of byte;
begin
  result := false;
  Handle := IcmpCreateFile;
  if Handle = INVALID_HANDLE_VALUE then
   Exit;
  TranslateStringToTInAddr(InetAddress, InAddr);
  DW := IcmpSendEcho(Handle, InAddr, nil, 0, nil, @rep, 128, 0);
  Result := (DW <> 0);
  IcmpCloseHandle(Handle);
end;
Ok, schonmal danke im Vorraus.
cya
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.262 Beiträge
 
Delphi 2006 Professional
 
#14

Re: ping in Delphi ausführen

  Alt 9. Sep 2003, 00:41
Mion nTE,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Wenn Du ein Timeout, also Wartezeit bis zur Antwort, von 0 angibst, muss die Funktion ja fehlschlagen.
Standardmässig stelle ich da 1000 ein, 500 sollte meist auch gehen.
Wenn der Rechner erreicht werden kann kehrt die Funkion eh' eher zurück.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

Re: ping in Delphi ausführen

  Alt 9. Sep 2003, 00:48
Ich würde den TimeOut übrigens noch als Funktionsparameter mit übergeben.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von nTE
nTE

Registriert seit: 8. Sep 2003
60 Beiträge
 
#16

Re: ping in Delphi ausführen

  Alt 9. Sep 2003, 00:59
Wow das klappt ja super hier. (Und danke für die herzliche Begrüßung )

Ich drohe jetzt schon mal mit weiteren Beiträgen dieser Sorte.

Danke auf jeden Fall für die Antwort, die MSDN-Hilfe zu IcmpSendEcho habe ich nur kurz überflogen und der Code für die Fkt. Ping stammt nicht von mir (hehe, jaja selbst Schuld), daher dachte ich, die Lösung liegt woanders.

Naja, auf jeden Fall funktioniert es jetzt und dafür nochmal ein Dankeschön an dich.

Beim nächsten Mal werde ich mich wohl etwas genauer mit der Materie befassen bevor ich sowas frage.

(Was nicht heissen soll, dass dein Beitrag mir das Gefühl gibt eine dumme Frage gestellt zu haben )

cya
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: ping in Delphi ausführen

  Alt 9. Sep 2003, 15:01
Ich würde etwas mehr als 1000 als Timeout nehmen, etwa 1200-1300.
Grund: Wenn ich jemanden anpinge (der über DSL im Netz ist), der gerade etwas runterlädt bzw. ein P2P-Programm laufen hat, bekomme ich meistens Pings um 1000.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.536 Beiträge
 
#18

Re: ping in Delphi ausführen

  Alt 7. Jul 2004, 09:14
if IcmpSendEcho(hICMP,MAKELONG(MAKEWORD(192, 168),MAKEWORD(1, 1)),nil,0,nil,pierWork,dwSize,1000) = 0 then Das heißt, wenn null zurückkommt, ist der PC unerreichbar. Was bedeutet der Rückgabewert, wenn der PC erreichbar ist? Ist das die Antwortzeit?

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Mirilin
Mirilin

Registriert seit: 21. Dez 2002
Ort: Lenzburg
861 Beiträge
 
Delphi 6 Professional
 
#19

Re: ping in Delphi ausführen

  Alt 7. Jul 2004, 10:39


PSDK
Return Values
Returns the number of ICMP_ECHO_REPLY structures stored in ReplyBuffer. The status of each reply is contained in the structure. If the return value is zero, call GetLastError for additional error information.



mfg Tobias
Tobias
Die Physik ist für die Physiker eigentlich viel zu schwer.
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.536 Beiträge
 
#20

Re: ping in Delphi ausführen

  Alt 7. Jul 2004, 10:47
Achso, ich habs gefunden:
ICMP_ECHO_REPLY.RoundTripTime
Dort steht die Zeit drin.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf