Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Zufälliger freier TCP Port abfragen (https://www.delphipraxis.net/128797-zufaelliger-freier-tcp-port-abfragen.html)

cytrinox 6. Feb 2009 10:55


Zufälliger freier TCP Port abfragen
 
Hi,

für eine IPC Speziallösung die ich mir geschrieben habe verwende ich den Indy10 TCPServer.
Zum Test hab ich den einfach mal auf 127.0.0.1:5000 gebunden.

Das Programm dass diesen Server aber startet, kann zwar pro Windows-User nur einmal gestartet werden, auf einem Terminal-Server können aber mehrere Instanzen laufen.

Also hab ich mir überlegt, einfach bei Windows oder den Indy Komponenten "abzufragen", welcher Port noch frei ist, so dass ich die Vergabe dynamisch machen kann. Den Port schreib ich dann in die Windows-Registry unter HKEY_CURRENT_USER. Die Routinen, die dann auf den IPC Dienst zugreifen müssen, holen sich den Port dort raus.

Gibt es eine Art getRandomFreeTCPPort() Funktion oder bleibt mir nur übrig mit try/except so lange einen Port Range durchzuprobieren bis es klappt?

smallsmoker 6. Feb 2009 10:59

Re: Zufälliger freier TCP Port abfragen
 
Liste der Anhänge anzeigen (Anzahl: 1)
also ich hab mir was zusammengewurschtelt um zu gucken ob ein port offen ist kannst das ja in ner schleife benutzen vieleicht ist es schneller als es mit try except und den indys zu machen da man bei mir ein timeout einstellen kann...

edit: es fehlt die unit utils man kann einfach delay durch sleep ersetzen oder es reinkopieren.

sirius 6. Feb 2009 11:40

Re: Zufälliger freier TCP Port abfragen
 
Und woher soll dann ein Client wissen, welchen Port er gerade nehmen soll?

cytrinox 6. Feb 2009 11:45

Re: Zufälliger freier TCP Port abfragen
 
Naja, das Problem ist eher, wenn z.b. 50 Instanzen laufen und die nächste will auch einen Server starten müssen 50 try/excepts durchgeführt werden oder mit deiner pas Datei eben 50x mal ein connect().

Ich könnte allerdings auch einfach eine Zufallszwahl zwischen 0 und 1000 nehmen und z.B. auf 5000 addieren - und das mache ich solange bis keine Exception mehr geworfen wird.

Aber mal eine andere Frage: Ist das Konzept so brauchbar? Also ich meine, muss ich mir Gedanken machen dass ein Admin vielleicht aus irgendeinem Grund per Firewall die Verbindung blockt? Oder dass irgendwelche AntiVirus+Firewall Software die Verbindung verhindern?

Ich sehe zwar momentan überhaupt keinen Grund warum man/die Software sowas tun sollte, aber technisch möglich ist es ja ;)

Laufen soll das ganze nämlich von Windows 2000 über Windows XP Home (Laptops usw) bis hin zu Windows 2008 Server bzw. CITRIX Systeme.

Zitat:

Zitat von sirius
Und woher soll dann ein Client wissen, welchen Port er gerade nehmen soll?

Steht doch schon im Beitrag...
Der Server speichert die Portnummer im HKEY_CURRENT_USER Zweig

sirius 6. Feb 2009 12:06

Re: Zufälliger freier TCP Port abfragen
 
Sorry, überlesen.

Ich weis nicht, wie die indys aufgebaut sind. Aber wenn man den Port 0 angibt bekommt man eigentlich einen freien zugewiesen.

cytrinox 6. Feb 2009 12:37

Re: Zufälliger freier TCP Port abfragen
 
Booh, wunderbar.

Über TCPIPCServer.Bindings.Items[0].Port komme ich nach einem active := true auch gleich an die entsprechende Portnummer.


Vielen Dank :)


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