AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ping per WinAPI

Ein Thema von CalganX · begonnen am 31. Aug 2003 · letzter Beitrag vom 8. Jan 2004
Antwort Antwort
Seite 3 von 3     123   
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#21

Re: Ping per WinAPI

  Alt 1. Sep 2003, 13:51
Hi,
@ichhabefertig: musst du.
@Hagen: Jetzt wollte ich das mal selber machen und dann das... Naja. Vermutlich werde ich mir das mal ansehen.

Chris
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#22

Re: Ping per WinAPI

  Alt 1. Sep 2003, 13:55
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
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#23

Re: Ping per WinAPI

  Alt 4. Sep 2003, 09:03
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;
Egal was ich der Funktion übergebe, ich bekomme immer False zurück?!
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#24

Re: Ping per WinAPI

  Alt 4. Sep 2003, 11:15
Die Funktion hat ein minimales Errorhandling. Du mußt jetzt per Debugger testen wie weit die Funktion kommt.

Gruß Hagen
  Mit Zitat antworten Zitat
moritz

Registriert seit: 18. Apr 2003
1.037 Beiträge
 
#25

Re: Ping per WinAPI

  Alt 8. Dez 2003, 19:01
Hallo

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

Gruß
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#26

Re: Ping per WinAPI

  Alt 8. Dez 2003, 19:10
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
  Mit Zitat antworten Zitat
moritz

Registriert seit: 18. Apr 2003
1.037 Beiträge
 
#27

Re: Ping per WinAPI

  Alt 8. Dez 2003, 19:12
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ß
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer
  Mit Zitat antworten Zitat
Rainer_Unger

Registriert seit: 2. Dez 2003
Ort: Heidelberg
17 Beiträge
 
#28

Re: Ping per WinAPI

  Alt 8. Jan 2004, 09:30
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
Ich weiss was ich kann und vor allem auch was ich nicht kann!
Du auch?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 09:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz