Delphi-PRAXiS
Seite 3 von 3     123   

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 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 22:58 Uhr.
Seite 3 von 3     123   

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