Entwickler-Ecke

Internet / Netzwerk - TCP/IP: freien Port suchen / Hosts auflisten


Andreas Pfau - Do 29.05.03 17:30
Titel: TCP/IP: freien Port suchen / Hosts auflisten
Hallo,

ich bin ein absoluter Netzwerk-Neuling und arbeite mich grade in die Datenübertragung mit TCP/IP ein. Ich habe 2 Rechner miteinander vernetzt, und will einfach ein bisschen rumrüfteln. Dabei habe ich 2 Probleme:

1) Ich muss ja immer einen Port angeben. Gibt es Prozeduren, die automatisch nach dem nächsten freien Port suchen?

2) Wie kann ich alle verfügbaren Hosts auflisten lassen? Also in etwa so wie unter "Netzwerkumgebung", damit der User angeben kann, mit wem er sich evrbinden will.

Und noch was wegen den Ports: soll ich für Server und Client den selben Port verwenden oder verscheidenen nehmen? Es geht mit dem gleichen Port, aber bringt das irgendwelche Nachteile?


mars - Do 29.05.03 18:22

Hallochen

Zu 1: Was heisst für dich ein freier Port? Einer an dem keine Anwendung lauscht oder auf welchem keine Connection nach aussen besteht? Ich denke, du siehst, dass es nicht so einfach ist, freie Ports zu finden. Deshalb gibt es -soviel ich weiss- auch keine Funktion, die dir einfach den nächsten freien Port zurückgibt.

Zu 2: Unter NT/2000/XP gibt es das [http://www.delphi-forum.de/viewtopic.php?t=1907]. Unter 9x weiss ich es nicht (vielleicht SwissDelphiCenter?)

Zu 3: Spielt meiner Meinung nach keine Rolle.


Andreas Pfau - Do 29.05.03 18:38

Danke für den Link!

Das mit dem Port: Ich brauche doch einen FREIEN Port, oder kann ich einfach einen X-Beliebigen nehmen? Wie gesagt, ich kenne mich da kaum aus. Welchen Bereich darf ich verwenden, und spielt es eine Rolle, ob ein anderes Prog den schon benutzt?


bis11 - Do 29.05.03 18:42

Du kannst auf die Seite von Luckie gehen und Dir dort den Portscanner mal anschauen oder Du suchst Dir den Beitrag Postscanner hier aus der Freeware-Sparte raus. Dort gibt es mehrere Versionen.


mars - Do 29.05.03 18:44

Die ersten 1024 Ports sind eigentlich registrierte Ports und die solltest du in der Regel nicht verwenden. Hier [http://www.securityspace.com/smysecure/daudit_ports.html] hast du eine Aufstellung bekannter Ports. Darüber kannst du alles verwenden.


Andreas Pfau - Do 29.05.03 18:47

OK, lass' mich zusammenfassen:
- Den Port muss der User wählen, von 1025 aufwärts
- Ich kann auch dann einen Port nehmen, wenn eine andere Anwendung denselbern schon benutzt

Ist das korrekt?


bis11 - Do 29.05.03 18:48

mars hat folgendes geschrieben:
Die ersten 1024 Ports sind eigentlich registrierte Ports und die solltest du in der Regel nicht verwenden. Hier [http://www.securityspace.com/smysecure/daudit_ports.html] hast du eine Aufstellung bekannter Ports. Darüber kannst du alles verwenden.


Das stimmt nicht ganz, da die Ports für Datenbanken oberhalb der 1025 liegen. Deshalb aufpassen, welcher Port verwendet wird.


Andreas Pfau - Do 29.05.03 18:53

@mars: Die Methode funzt auch unter Win98. Laut WinAPI ist nur Win32s ausgeschlossen, aber das ist mir eh' egal.

@bis11: Und was haißt das Im Klartext? Ich frage nochmal: Wenn ein anderes Prog schon den selben Port verwendet, macht das was? wenn nein, könnte ich ja, sagen wir mal, 2000 als Standard nehmen, oder?


mars - Do 29.05.03 19:05

Es macht was, wenn ein anderes Programm den gleichen Port schon verwendet, denn dann weiss der Server ja nicht, an welches Programm er die eintreffenden Daten weiterreichen soll.


Andreas Pfau - Do 29.05.03 19:15

OK, Danke!

Dann lasse ich also den User einen Port (> 1024) auswählen, oder wie würdest du das machen?


Andreas Pfau - Do 29.05.03 19:20

Nochmal zurück zu den Clients: Meine Computer-Hosts sind "PC1" und "PC2". Die Auflist.Methode gibt aber "\\PC1" bzw. "\\PC2" zurück. Was sollen die Backslashs? Kann ich die einfach wegmachen, ich meine, ist das bei ALLEN Netzwerken so, dass einfach "\\" vor den Host kommt? Denn wenn die die als Host angebe, funzt es nicht, nur ohne Backslash.


Andreas Pfau - Do 29.05.03 21:11

Hallo,

noch 'ne Frage: Ist "LocalHost" auf jedme PC grundsätzlich definiert? Ich meine, kann ich in meine Host-Liste den LocalHost immer einfügen, oder kann es sein, dass dieser Host gar nicht existiert bzw. dass der NAme bereits an einen anderen PC vergeben ist?


MSCH - Do 29.05.03 22:20

Andreas Pfau hat folgendes geschrieben:
Hallo,

noch 'ne Frage: Ist "LocalHost" auf jedme PC grundsätzlich definiert? Ich meine, kann ich in meine Host-Liste den LocalHost immer einfügen, oder kann es sein, dass dieser Host gar nicht existiert bzw. dass der NAme bereits an einen anderen PC vergeben ist?


Erstmal grundsätzlich ja. Localhost ist immer da. Genauso wie 127.0.0.1.
Ich glaube, du solltest dich erst mal mit TCP/IP Netzwerken einlesen, dann ist einiges einfacher.
grez
msch


FriFra - Do 29.05.03 23:06

Ich verwende folgende Funktion um Ports zu testen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function IsPortFree(Port: integer): boolean;
var
  TCPClient: TIdTCPClient;
begin
  Result := True;
  try
    TCPClient := TIdTCPClient.Create(nil);
    IdTCPClient1.Port := Port;
    try
      IdTCPClient1.Connect;
    except
    end;
  finally
    if IdTCPClient1.Connected = True then
    begin
      Result := False;
      IdTCPClient1.Disconnect;
    end;
    IdTCPClient1.DisconnectSocket;
    TCPClient.Free;
  end;
end;


Wenn Du einem Server einen Port zuweist ist es zwingend, dass am System kein 2. Server auf dem gleich Port läuft, wohingegen "unbegrenzt" viele Clients den selben Port nutzen können.

Hinweis: Der Code führt bei belegten Ports zu Fehlermeldungen im Compiler, welche aber unterdrückt werden können.


w3seek - Fr 30.05.03 11:48

einen freien port sucht sich die winsock automatisch, wenn du einfach auf port 0 listenst ;) allerdings koennen nicht alle tcp komponenten dann herausfinden welcher port das ist, das musst du dann direkt mit der winsock api machen, ist aber nicht schwer (glaube nur 1 oder 2 zeilen)


Andreas Pfau - Fr 30.05.03 11:56

Danke, ich werde eure Tipps mal probieren! :D

PS: @MSCH, welche Site zum "einlesen" empfiehlst du?


MaxiTB - Fr 30.05.03 13:20

Schau mal hier nach, Andi ...

http://www.delphi-treff.de/content/tutorials/socketkurs/index.php4?kat=2

Einfach durchlesen.


Andreas Pfau - Fr 30.05.03 17:24

Super, danke, ich werde mich mal durcharbeiten!


Andreas Pfau - Fr 30.05.03 21:19

@MaxiTB, habe mir das mal angeschaut, super Link, aber eine frage bleibt offen: Was sollen die 2 Backslashs vo den Hostnamen? Kann ich die einfach wegschneiden, will sagen, sind die GRUNDSÄTZLICH da, oder können die auch zum Hostnamen gehören? Oder, WANN werden die angezeigt?


MaxiTB - Mo 02.06.03 10:26

Das sind ja auch zwo poar Schuach ;-) .

Der Doppelbackslash ist eine Windows-Notation (hat sogar irgendeinen hübschen Namen, den ich immer wieder vergesse), welche verwendet wird, um Netzwerkresourcen anzusprechen.

Also wenn du einen Computer (per LMHOST Auflösung) mit seinem Namen ansprechen willst, dann gibts du das folgendermaßen an:

\\<LMHOST-ComputerName>

Oder natürlich geht auch:

\\<LMHOST-ArbeitsgruppenName>
\\<LMHOST-DomainName>

Simpel ausgedrückt:
C: - Das Laufwerk heißt per Namen C aber laut Win-Syntax ist das Ding in einer Pfadangabe nur mit : gültig.

Gibts da Regeln wann oder wie ?

Jep - die gibts - aber wie in der Windowswelt üblich sind sie löchrig und voller Ausnahmen (mit Blick auf die API *g*) ... hat also nicht vil Sinn hier die mit Fachgelabbere breitzutreten - Fausregel: Wird ein Pfad verlangt dann mit DBS, wenn der Name verlangt wird einfach ohne. Im Notfall hilft wie so oft einfach nur ausprobieren.


Andreas Pfau - Mo 02.06.03 19:03

Gut, Danke! Habe das so gelöst: Die Routine liefert ja MIt DBS. Wenn ein DBS da ist, wird er gelöscht. Klappe zu, Affe tot. Triviallösung, denn ich denke mal, ein DBS in Hostnamen ist verboden, oder? Also kann ich ihn getrost löschen.


MaxiTB - Mi 04.06.03 09:33

Ungefähr - du bekommst eine Pfadangabe zurück und mußt einfach nur davon den Computername extrahieren - also weg mit dem DBS - fertig. *g*