Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Welcher Dienst hinter welchem Port? (https://www.delphipraxis.net/17296-welcher-dienst-hinter-welchem-port.html)

jackie 2. Mär 2004 18:40


Welcher Dienst hinter welchem Port?
 
Hi!
Ich benütze folgenden Code, um herauszufinden, ob ein Port offen ist (nur im lokalen Netzwerk; nichts illegales :mrgreen: ):
Delphi-Quellcode:
function PortPresent(const URL: String; Port: DWord): Boolean;
// URL can be like [url]www.developers.org[/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;
Mich würde nun interessieren, ob ich irgendwie herausfinden kann, welcher Dienst hinter welchem Port steckt (zB Port 22 = SSH). Gibt es dafür eine Möglichkeit?

SleepyMaster 2. Mär 2004 18:56

Re: Welcher Dienst hinter welchem Port?
 
Ja, indem du die Daten in einer art Datenbank speicherst.
Allerdings musst du dir vorher erst mal die Infos sammeln.

Bei Google suchenPortlist

jackie 2. Mär 2004 19:24

Re: Welcher Dienst hinter welchem Port?
 
Gehts nicht einfacher?
zB dass man mit einer Funktion einen Art Identifier - String des Dienstes ausliest? Es kann ja auch sein, dass die Ports vom Systemadmin vertauscht werden. Wenns nicht geht, dann mach ichs mit der Datenbank, aber anders wärs mir lieber.

Aber vorerst mal danke :)

neolithos 3. Mär 2004 07:22

Re: Welcher Dienst hinter welchem Port?
 
In der WinSock gibt es...

Aus der MDSN
Code:
struct servent FAR * getservbyport(
  int port,            
  const char FAR *proto
);

jackie 3. Mär 2004 12:32

Re: Welcher Dienst hinter welchem Port?
 
Ich kann kein c. Könntest du mir das für Delphi übersetzen?

[edit]Schon geschafft. Danke[/edit]

jackie 3. Mär 2004 17:33

Re: Welcher Dienst hinter welchem Port?
 
Also ich bräuchte jetzt doch ein Beispiel. Ich habe es versucht mit
Delphi-Quellcode:
Edit1.Text := getservbyport(22,nil);
aber es geht nicht.

Blechwolf 4. Mär 2004 09:49

Re: Welcher Dienst hinter welchem Port?
 
Zitat:

Zitat von jackie
Delphi-Quellcode:
Edit1.Text := getservbyport(22,nil);
aber es geht nicht.

Was eigentlich auch klar ist, da Dir getservbyport keinen String sondern ein struct (record auf Delphianisch) zurück liefert. (siehe auch getservbyname)

Code:
struct servent {
    char FAR *        s_name;
    char FAR * FAR *  s_aliases;
    short            s_port;
    char FAR *        s_proto;
};
Probiers evtl. mal mit
Delphi-Quellcode:
Edit1.Text := getservbyport(22,nil).s_name;
Ansonsten mußt Du mal schauen, wie Du die Struct-Elemente in Delphi ansprichst.

Grüße

Wolf

jackie 4. Mär 2004 13:13

Re: Welcher Dienst hinter welchem Port?
 
Hi Blechwolf!
Auf das mit dem Record hätte ich selber kommen können :wall:
Ich habs jetzt so versucht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := getservbyport(22,nil).s_name;
end;
Aber jedes mal wenn ich auf den Button drücke, bekomme ich eine Access Violation. Wieso? Was mache ich falsch?

jackie 5. Mär 2004 14:17

Re: Welcher Dienst hinter welchem Port?
 
Weiß wirklich keiner was? :(

neolithos 5. Mär 2004 14:23

Re: Welcher Dienst hinter welchem Port?
 
Delphi-Quellcode:
var p : servent;
    sTmp : String;
begin
  p := getservbyport(22, nil);
  if p = nil then
     begin
       sTmp := p^.s_name; // Kopiere inhalt
       Edit1.Text := sTmp;
     end;
end;

Blechwolf 5. Mär 2004 14:28

Re: Welcher Dienst hinter welchem Port?
 
Zitat:

Zitat von neolithos
Delphi-Quellcode:
var p : servent;
    sTmp : String;
begin
  p := getservbyport(22, nil);
  if p = nil then
     begin
       sTmp := p^.s_name; // Kopiere inhalt
       Edit1.Text := sTmp;
     end;
end;

Mal dumm gefragt, wäre if p <> nil nicht geschickter ?

Grüße

Wolf

jackie 5. Mär 2004 14:38

Re: Welcher Dienst hinter welchem Port?
 
Hi!
Also wenn ich die Version mit
Delphi-Quellcode:
if p = nil then ...
benutze dann bekomme ich eine AV.
Bei
Delphi-Quellcode:
if p <> nil then ...
tut sich gar nichts, wenn ich auf den Button drücke.

neolithos 5. Mär 2004 14:40

Re: Welcher Dienst hinter welchem Port?
 
Erstmal Ups.

Zitat:

Zitat von jackie
Delphi-Quellcode:
if p <> nil then ...

So ist es richtig!

Hast du

WSAStartup bzw. WSACleanUp gerufen?

neolithos 5. Mär 2004 14:43

Re: Welcher Dienst hinter welchem Port?
 
Meine Weisheiten kann man unter

MSDN (Microsoft)

nachlesen.

jackie 5. Mär 2004 14:44

Re: Welcher Dienst hinter welchem Port?
 
Zitat:

Hast du

WSAStartup bzw. WSACleanUp gerufen?
Nein. Wie soll ich das denn aufrufen? :oops:

Chewie 5. Mär 2004 15:06

Re: Welcher Dienst hinter welchem Port?
 
Zitat:

Zitat von jackie
Nein. Wie soll ich das denn aufrufen? :oops:

So, wie in dem Codebeispiel in deinem ersten Post ;)

Allerdings sollte dann keine Access Violation ausgelöst werden, sondern ein WSAENOTINITIALIZED (oder so ähnlich, ich hab grad kein PSDK da, auf Jeden Fall eine 5stellige Zahl mit einer 1 vorne ;)).

APP 5. Mär 2004 15:07

Re: Welcher Dienst hinter welchem Port?
 
öhmm jackie, Du machst es ja doch:

Zitat:

Hast du
WSAStartup bzw. WSACleanUp gerufen?

Nein. Wie soll ich das denn aufrufen?
Nämlich genau hier (Dein 1. Post):
Zitat:

Zitat von jackie
...
if WsaStartup(MakeWord(1, 1), W) = 0 then
...
WSACleanup;
...

Allerdings würde ich Dir empfehlen, diese beiden Aufrufe
in einen Ressourcenschutzblock TRY/FINALLY zu legen,
weil mit WSAStartup die WS2_32.dll dynamisch nachgeladen
wird, und Du dann sicherstellt, dass am Ende alles wieder
aufgeräumt wird.

jackie 5. Mär 2004 16:16

Re: Welcher Dienst hinter welchem Port?
 
@APP: Ich hab das mit dem getservbyport gar nicht in die erste funktion eingebaut, sondern wollte es einfach im OnClick eines Buttons aufrufen, da ich keine Ahnung habe, wo ich es in der oben gezeigten Funktion einbinden soll.
Wenn es mir jemand zeigen kann, wäre ich sehr dankbar.

APP 5. Mär 2004 17:01

Re: Welcher Dienst hinter welchem Port?
 
Hallo Gregor,
mal schnell zusammengezimmert:

Delphi-Quellcode:
VAR
  p                               : PServEnt;
  WSAData                         : TWSADATA;
  Port                            : DWORD;
BEGIN
  // FTP
  Port := 21;
  IF WsaStartup(MakeWord(2, 0), WSAData) = 0 THEN
  TRY
    // Achtung, Port muss in Network Byte Order vorliegen
    p := getservbyport(hTons(Port), NIL);
    IF WSAGetLastError = 0 THEN
      BEGIN
        IF p <> NIL THEN
          BEGIN
            Edit1.Text := p^.s_name;
          END;
      END
    ELSE
      BEGIN
        CASE WSAGetLastError OF
          WSANOTINITIALISED: ShowMessage('A successful WSAStartup call must occur before using this function');
          WSAENETDOWN: ShowMessage('The network subsystem has failed.');
          WSAHOST_NOT_FOUND: ShowMessage('Authoritative Answer Service not found.');
          WSATRY_AGAIN: ShowMessage('A nonauthoritative Service not found, or server failure.');
          WSANO_RECOVERY: ShowMessage('Nonrecoverable errors, the services database is not accessible.');
          WSANO_DATA: ShowMessage('Valid name, no data record of requested type.');
          WSAEINPROGRESS: ShowMessage('A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.');
          WSAEFAULT: ShowMessage('The proto parameter is not a valid part of the user address space.');
          WSAEINTR: ShowMessage('A blocking Windows Socket 1.1 call was canceled through WSACancelBlockingCall.');
        END;
      END;
  FINALLY
    WSACleanup;
  END;
END;

jackie 5. Mär 2004 17:06

Re: Welcher Dienst hinter welchem Port?
 
Hallo APP!
Danke, das funktioniert wunderbar. :-D


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