Wenn Sie die genaue Art der Umgebung, in der Ihre Anwendung ausgeführt wird, nicht vorhersagen können, kümmern Sie sich einfach nicht darum. Wählen Sie eine beliebige Zahl über 1024 und machen Sie sie konfigurierbar, damit der Benutzer sie im Falle eines Konflikts mit einem anderen Dienst/einer anderen Anwendung ändern kann.
Natürlich können Sie trotzdem sehr gebräuchliche Ports wie 8080 (alternativ HTTP) oder 3128 (Proxies wie Squid), 1666 (notwendigerweise) usw. vermeiden. Eine umfassende Liste bekannter Ports finden Sie hier, oder werfen Sie einen Blick auf /etc/services .
Wenn Sie sich nicht um die Portnummer kümmern und nichts dagegen haben, dass sie sich jedes Mal ändert, wenn Ihr Programm ausgeführt wird, binden Sie den Port einfach nicht, bevor Sie ihn abhören (oder binden Sie mit Port 0, wenn Sie binden möchten eine bestimmte IP-Adresse). In beiden Fällen weisen Sie das Betriebssystem an, einen freien Port für Sie auszuwählen.
Nachdem Sie mit dem Zuhören begonnen haben, verwenden Sie getsockname
um herauszufinden, welcher Port ausgewählt wurde. Sie können es in eine Datei schreiben, es auf dem Bildschirm anzeigen, es einem Kind über fork
erben lassen usw.
Prüfen Sie bei einer statischen Anwendung /etc/services
um einen Port zu finden, der nicht mit irgendetwas anderem kollidiert, das Sie verwenden, und der an anderer Stelle nicht allgemein verwendet wird.
$ tail /etc/services
nimspooler 48001/udp # Nimbus Spooler
nimhub 48002/tcp # Nimbus Hub
nimhub 48002/udp # Nimbus Hub
nimgtw 48003/tcp # Nimbus Gateway
nimgtw 48003/udp # Nimbus Gateway
com-bardac-dw 48556/tcp # com-bardac-dw
com-bardac-dw 48556/udp # com-bardac-dw
iqobject 48619/tcp # iqobject
iqobject 48619/udp # iqobject