Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 03:44 Uhr.
Seite 2 von 2     12   

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