![]() |
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. ;) |
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. |
Re: Ping per WinAPI
Hi Chewie,
werde ich sofort machen. Alternativ habe ich bei ![]() Chris |
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; |
Re: Ping per WinAPI
Hi Hagen,
wunderbar! Das ist die Ergänzung, zu dem was ich eigentlich wollte... :) Kannst du Gedanken lesen? :shock: ;) Chris |
Re: Ping per WinAPI
Zitat:
|
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 |
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. |
Re: Ping per WinAPI
Zitat:
|
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:
|
Re: Ping per WinAPI
Hi,
:lol: :mrgreen: Chris PS: Das klappt unter Delphi, aber unter C++ geht gar nix... :evil: |
Re: Ping per WinAPI
Zitat:
Zitat:
|
Re: Ping per WinAPI
Zitat:
Zitat:
Gruß Hagen |
Re: Ping per WinAPI
Hi,
es geht um die IcmpSendEcho-Funktion. :( Naja, bin noch immer dran... :| Chris |
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 |
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 |
Re: Ping per WinAPI
Du hättest mal danach suchen können:
![]() Dort gabs das schonmal. Und unter C++ funktioniert das sicher auch, es werden ja nur WinAPI-Funktionen benutzt. |
Re: Ping per WinAPI
Hi,
da wird aber nur von den Indys gesprochen... ;) Chris PS: *duck* Okay, Christian hat da was geschrieben... Sorry. |
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 |
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 |
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 |
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 |
Re: Ping per WinAPI
Zitat:
|
Re: Ping per WinAPI
Die Funktion hat ein minimales Errorhandling. Du mußt jetzt per Debugger testen wie weit die Funktion kommt.
Gruß Hagen |
Re: Ping per WinAPI
Hallo
Mal eine Frage: Wenn die IP nicht existiert und
Delphi-Quellcode:
ausgeführt wird, hängt sich die Funktion auf. Kann man da ein TimeOut angeben?
Result := Connect(S, A, SizeOf(A)) = 0;
Gruß |
Re: Ping per WinAPI
Zitat:
Gruß Hagen |
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ß |
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