Autor Beitrag
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Sa 06.10.12 19:51 
Hi!

Ich brauche für eine API einen beliebigen freien TCP-Port, den ich dann dem Host-Programm zwecks Kommunikation übermittle.
Momentan fange ich einfach bei irgend einer Zahl an und zähle von dort aus durch, in der Hoffnung dass ich nicht so viele brauche dass ich einen anderen Server treffe.

Die Frage nach dem "Port belegt oder nicht" hatten wir schonmal, da war dann die Antwort "Socket aufmachen, wenn's eine Exception gibt ist da schon wer".

Ist das wirklich die einzige Möglichkeit, oder gibts dafür eine Abfrage-Funktion?
Irgendwie gefällt mir das nämlich nicht, mit etwas Pech wären das ja eine Reihe von Exceptions, und Debuggen in der IDE kann man dann vergessen.

Viele Grüße,
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Sa 06.10.12 20:26 
Ich hab es zwar nicht getestet, aber gerade mehrfach im Internet gefunden:

Zitat:
With Indy just set the port to 0, and it will assign a free port for you.


Quelle u. a.: www.delphigroups.info/2/4f/188923.html

Vielleicht hilft es Dir weiter.

Für diesen Beitrag haben gedankt: Martok
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 06.10.12 23:04 
Moin!

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Ich brauche für eine API einen beliebigen freien TCP-Port
Was für einen denn, einen listening-port für einen Server? Oder einen Client, dann kann man das der WSA überlassen, wie user profile iconGerd Kayser schon sagte.

Ansatz für einen Server-Port: mit netstat -a an der Kommandozeile kann man sich eine Portliste holen, also gibt´s da auch irgendeine API drunter, mit der man so eine Portliste kriegen kann. Notfalls das Tool nehmen und die Ausgabe auswerten. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: Martok
Martok Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Sa 06.10.12 23:19 
Moin!

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
Zitat:
With Indy just set the port to 0, and it will assign a free port for you.
Das...

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Was für einen denn, einen listening-port für einen Server? Oder einen Client, dann kann man das der WSA überlassen, wie user profile iconGerd Kayser schon sagte.
... funktioniert wunderbar ;)
Die Sache mit der 0 war genau das richtige Stichwort, stellt sich raus dass das allgemein immer mit bind() geht, unabhängig davon ob man danach connect oder listen macht.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  procedure SetupServer(var aServer: TServerSocket);
  var
    ia: sockaddr_in;
    sz: integer;
  begin
    aServer:= TServerSocket.Create(Self);
    aServer.OnClientRead:= OnServerData;

    aServer.Port:= 0;
    aServer.Active:= True;
    sz:= SizeOf(ia);
    getsockname(aServer.Socket.SocketHandle, ia, sz);
    aServer.Tag:= ntohs(ia.sin_port);
  end;


Damit bindet mir die WSA einfach den Socket an "irgendeinen" Port. Den lese ich dann zurück und leg ihn im Tag ab (in .Port geht nicht, da kann man nicht schreiben, während der Socket aktiv ist). Dann kann ich der API mitteilen dass sie bitte da ihre Daten abwerfen soll und alles funktioniert.

Damit ist das der zweite "ist der Port noch frei"-Thread, der dann ganz anders gelöst wurde. Klingt langsam nach einem Fall von falsche Frage.

Dannke,
Martok

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."

Für diesen Beitrag haben gedankt: Narses