Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Ping per WinAPI (https://www.delphipraxis.net/8231-ping-per-winapi.html)

CalganX 31. Aug 2003 16:56


Ping per WinAPI
 
Hi,
im Forum gibt es nur Indy-Möglichkeiten einen Ping auszuführen. Allerdings suche ich eine API-Lösung.

Wenn jemand eine kennt, wäre ich dankbar! ;)

Chris

PS: Wenn diese Möglichkeit auch unter C++ funktioniert, dann bin ich zufrieden. ;)

Chewie 31. Aug 2003 17:09

Re: Ping per WinAPI
 
Schau dir mal IcmpSendEcho und Verwandte an.

Alternativ benutz RawSockets und bau dir das ICMP-Paket selber zusammmen. Empfehlen würd ich aber erstere Methode.

CalganX 31. Aug 2003 17:10

Re: Ping per WinAPI
 
Hi Chewie,
werde ich sofort machen.

Alternativ habe ich bei The Code Project noch was gefunden. Allerdings ist das ziemlich viel Source.

Chris

negaH 31. Aug 2003 17:14

Re: Ping per WinAPI
 
Delphi-Quellcode:
function PortPresent(const URL: String; Port: DWord = 80): Boolean;
// URL can be like [url]www.enterwickler.com[/url] or an IP like 127.0.0.1
var
  S: TSocket;
  A: SOCKADDR_IN;
  W: TWsaData;
  H: pHostEnt;
begin
  Result := False;
  if WsaStartup(MakeWord(1, 1), W) = 0 then
  begin
    H := GetHostByName(PChar(URL));
    if H <> nil then
    begin
      FillChar(A, SizeOf(A), 0);
      A.sin_family := AF_INET;
      A.sin_addr.S_addr := PDWord(H.h_addr_list^)^;
      A.sin_port := htons(Port);
      S := Socket(AF_INET, SOCK_STREAM, 0);
      if S <> INVALID_SOCKET then
      begin
        Result := Connect(S, A, SizeOf(A)) = 0;
        CloseSocket(S);
      end;
    end;
  end;
  WSACleanup;
end;

CalganX 31. Aug 2003 17:36

Re: Ping per WinAPI
 
Hi Hagen,
wunderbar! Das ist die Ergänzung, zu dem was ich eigentlich wollte... :) Kannst du Gedanken lesen? :shock: ;)

Chris

Chewie 31. Aug 2003 17:48

Re: Ping per WinAPI
 
Zitat:

Zitat von Chakotay1308
Kannst du Gedanken lesen? :shock: ;)

Das frage ich mich auch. Ich versuche gerade einen Zusammenzuhang zwischen der Frage und Hagens Anntwort zu finden :gruebel:

CalganX 31. Aug 2003 17:49

Re: Ping per WinAPI
 
Hi,
es soll irgendwo prüfen, ob eine IP existiert und dann der Port.

Ein direkter Zusammenhang existiert aber nicht... ;)

Chris

negaH 1. Sep 2003 12:09

Re: Ping per WinAPI
 
Wieso ? Warum will man Pingen um danach festzustellen das man denoch keine Connection zum gewünschten Port aufbauen kann. Wenn man nur einfach pingt, dann weis man bei Erfolg das die IP angesprochen werden kann. Allerdings was nützt das im weiteren Verlauf? wenn der entsprechende Port beim Server zu ist. Also kann man gleich eine Connection aufbauen zur IP/URL + Port um festzustellen ob man connecten kann.

Ich habe somit keine Gedanken gelesen :) (schön wäre es) sondern einfach nur weiter gedacht.

Zudem, wird zB. über einen Router/Proxy gepingt so wird in den meisten Fällen eine Connection zum Provider aufgebaut, falls sie noch nicht vorhanden war. D.h. ein reguläres Ping sagt NICHTS darüber aus ob man online ist/war. Echtes Pingen macht nur Sinn wenn man die Verbindung analysieren will, eg. Routing/Tracing.

Gruß Hagen

PS: ein Ping ist nur unwesentlich schneller als ein Connect auf einen Port. Egel wie man es sieht, im Fehlerfalle wird ein Ping genauso lange Timeouts haben wie ein Connect. Im Erfolgsfalle wird ein Ping nur minimal schneller sein als ein Conmect. Also kann man doch gleich einen Connect versuchen.

MathiasSimmack 1. Sep 2003 12:11

Re: Ping per WinAPI
 
Zitat:

Zitat von negaH
Ich habe somit keine Gedanken gelesen :) (schön wäre es) sondern einfach nur weiter gedacht.

Is´ aber schon nah dran ... :wink:

Chewie 1. Sep 2003 12:12

Re: Ping per WinAPI
 
Na gut. Wenn ich irgendwann einmal fragen sollte, wie ich einen Kuchen backe, dann erwarte ich, von dir gesagt zu kriegen, wie ich den Kucken verzieren soll :mrgreen:

CalganX 1. Sep 2003 12:16

Re: Ping per WinAPI
 
Hi,
:lol: :mrgreen:

Chris

PS: Das klappt unter Delphi, aber unter C++ geht gar nix... :evil:

MathiasSimmack 1. Sep 2003 12:17

Re: Ping per WinAPI
 
Zitat:

Zitat von Chewie
Na gut. Wenn ich irgendwann einmal fragen sollte, wie ich einen Kuchen backe, dann erwarte ich, von dir gesagt zu kriegen, wie ich den Kucken verzieren soll :mrgreen:

Kucken verzieren? Sollte das evtl.
Zitat:

[...] Kuchen verzehren [...]
heißen? :? *Wahrsagerkugel anhauch und noch mal reinschau* ... Hm, nein, vermutlich willst du das Ding wirklich verzieren ... :)

negaH 1. Sep 2003 12:18

Re: Ping per WinAPI
 
Zitat:

sondern einfach nur weiter gedacht
Ähm, weiter von "den Gedanken fortgesetzt" und nicht von "besser gedacht" :)

Zitat:

PS: Das klappt unter Delphi, aber unter C++ geht gar nix...
Du meinst meinen Source ? Tja, keine Ahnung für dein C++ bist'e schon selber verantwortlich. Allerdings, eigentlich müsste es auf Anhieb übersetzbar sein, da nur API + Berkeley Sockets benutzt wurden.


Gruß Hagen

CalganX 1. Sep 2003 12:27

Re: Ping per WinAPI
 
Hi,
es geht um die IcmpSendEcho-Funktion. :(

Naja, bin noch immer dran... :|

Chris

negaH 1. Sep 2003 12:28

Re: Ping per WinAPI
 
Was willst du schlußendlich mit dieser Funktion erreichen ?
Falls das zu Lernzwecken dient dann vergiß meine Frage, bitte.

Gruß Hagen

CalganX 1. Sep 2003 12:30

Re: Ping per WinAPI
 
Hi,
vielleicht kennst du das Programm "SuperScan". Aus reinen Lernzwecken wollte ich sowas mal nachprogrammieren. Mein Programm wird lange nicht den Umfang erreichen, allerdings Übung macht nunmal den Meister, oder? ;)

Chris

Chewie 1. Sep 2003 12:33

Re: Ping per WinAPI
 
Du hättest mal danach suchen können: http://www.delphipraxis.net/topic144...t=icmpsendecho

Dort gabs das schonmal. Und unter C++ funktioniert das sicher auch, es werden ja nur WinAPI-Funktionen benutzt.

CalganX 1. Sep 2003 12:38

Re: Ping per WinAPI
 
Hi,
da wird aber nur von den Indys gesprochen... ;)

Chris

PS: *duck* Okay, Christian hat da was geschrieben... Sorry.

negaH 1. Sep 2003 12:45

Re: Ping per WinAPI
 
Also, du benötigst keinen Ping. Falls du das gleiche wie SuperScan machen willst ist meine Funktion die richtige, im Grunde ist es ein PortScanner. Suche hier im Forum nach PortScanner und die wirst einen von Asservad, einen von Luckie und einen von mir finden. Zumindest der von Asserbad und mir ist um vieles schneller als SuperScan. Ich habe SuperScan gedownloaded und bei mir getestet. Er scannt nur eine Liste von bekannten Ports, ca. 1300 Ports sind in dieser Liste. Er benötigte dafür mehrere Minuten. Asserbads und mein PortScanner schaffen das in Sekunden.

Gruß Hagen

ichhabefertig 1. Sep 2003 12:48

Re: Ping per WinAPI
 
Hallo,

ich hätte da noch eine Frage zu der geposteten Function. Wenn ich aufd einen IP und eien Port connecten will, die/der nicht existiert, bleibt das Programm etliche Sekunden hängen. Wie kann ch das unterbinden? Muss ich das Timeout runtersetzen?

Danke

CalganX 1. Sep 2003 12:51

Re: Ping per WinAPI
 
Hi,
@ichhabefertig: musst du. ;)
@Hagen: :? Jetzt wollte ich das mal selber machen und dann das... :roll: Naja. Vermutlich werde ich mir das mal ansehen.

Chris

negaH 1. Sep 2003 12:55

Re: Ping per WinAPI
 
Tja, das ist die Frage die wir uns alle stellen. Man kann die LingerTime/Timeout usw. runtersetzen, doch leider hat das wenig Konsequenzen bzw. führt dazu das Ports als nicht erreichbar erkannt werden die aber erreichbar sind (eben nur sehr langsam reagieren).

Es gibt zwei Wege
1.) das MS WinSock API unterstützt asynchrone Socket Operationen. Man stößt mit diesem API eine Socketoperation an, und das API sendet eine Message an ein Fenster bei Fertigstellung dieser Funktion. Das bringt sehr wenig gegenüber:
2.) PortPresent in einen Thread auslagern.

Suche hier im Forum nach "PortScanner". Die Sourcen von Asserbad und mir bauen auf Threads auf. Meine Lösung ist teilweise VCL + API basiert, Asserbads Lösung ist vollständig Non-VCL.

Beide Lösungen scannen mithilfe von 256-2000 Threads gleichzeitig einen Portbereich.

Gruß Hagen

Tpercon 4. Sep 2003 08:03

Re: Ping per WinAPI
 
Zitat:

Zitat von negaH
Delphi-Quellcode:
function PortPresent(const URL: String; Port: DWord = 80): Boolean;
// URL can be like [url]www.enterwickler.com[/url] or an IP like 127.0.0.1
var
  S: TSocket;
  A: SOCKADDR_IN;
  W: TWsaData;
  H: pHostEnt;
begin
  Result := False;
  if WsaStartup(MakeWord(1, 1), W) = 0 then
  begin
    H := GetHostByName(PChar(URL));
    if H <> nil then
    begin
      FillChar(A, SizeOf(A), 0);
      A.sin_family := AF_INET;
      A.sin_addr.S_addr := PDWord(H.h_addr_list^)^;
      A.sin_port := htons(Port);
      S := Socket(AF_INET, SOCK_STREAM, 0);
      if S <> INVALID_SOCKET then
      begin
        Result := Connect(S, A, SizeOf(A)) = 0;
        CloseSocket(S);
      end;
    end;
  end;
  WSACleanup;
end;

:gruebel: Egal was ich der Funktion übergebe, ich bekomme immer False zurück?!

negaH 4. Sep 2003 10:15

Re: Ping per WinAPI
 
Die Funktion hat ein minimales Errorhandling. Du mußt jetzt per Debugger testen wie weit die Funktion kommt.

Gruß Hagen

moritz 8. Dez 2003 18:01

Re: Ping per WinAPI
 
Hallo

Mal eine Frage: Wenn die IP nicht existiert und
Delphi-Quellcode:
Result := Connect(S, A, SizeOf(A)) = 0;
ausgeführt wird, hängt sich die Funktion auf. Kann man da ein TimeOut angeben?

Gruß

negaH 8. Dez 2003 18:10

Re: Ping per WinAPI
 
Zitat:

Mal eine Frage: Wenn die IP nicht existiert und
Dann sollte eigentlich GetHostByName() schon fehlschlagen, da ja diese IP = URL nicht existiert. Einzigste Möglichkeit das GetHostByName() durchkommt ist wenn die URL selber schon eine IP ist. Dann sollte Connect() aber nur so lange warten bis der WinSock Timeout erreicht ist. Es gibt im Socket API Funktionen die diesen Timeout einstellen können.

Gruß Hagen

moritz 8. Dez 2003 18:12

Re: Ping per WinAPI
 
Hallo

Ich hab das ganze mal mit "217.217.217.217" versucht. Das Teil kommt durch, warten kann ich aber ne halbe Ewigkeit. Mit welcher Funktion kann man den Timeout einstellen?

Gruß

Rainer_Unger 8. Jan 2004 08:30

Re: Ping per WinAPI
 
Hi negah,

deine Funktion produziert einen Fehler in der Zeile:

A.sin_addr.S_addr := PDWord(H.h_addr_list^)^;

Fehler bei Bereichsprüfung. Bereichsprüfung wurde abgeschaltet.
Funktion so nicht brauchbar.

Rainer


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