Se non puoi prevedere il tipo esatto di ambiente che verrà eseguito dalla tua applicazione, non preoccuparti di questo. Scegli qualsiasi numero superiore a 1024 e rendilo configurabile in modo che l'utente possa modificarlo in caso di conflitto con un altro servizio/applicazione.
Ovviamente puoi ancora evitare porte molto comuni come 8080 (HTTP alternativo) o 3128 (proxy come squid), 1666 (per forza), ecc. Puoi controllare un elenco completo di porte conosciute qui o dare un'occhiata a /etc/services .
Se non ti interessa il numero di porta e non ti importa che cambi ogni volta che il tuo programma viene eseguito, semplicemente non associare la porta prima di ascoltarla (o associare con la porta 0, se vuoi associare un indirizzo IP specifico). In entrambi i casi, stai dicendo al sistema operativo di scegliere una porta libera per te.
Dopo aver iniziato ad ascoltare, usa getsockname
per scoprire quale porto è stato scelto. Puoi scriverlo su un file, visualizzarlo sullo schermo, farlo ereditare da un bambino tramite fork
, ecc.
Per un'applicazione statica, valuta la possibilità di selezionare /etc/services
per trovare una porta che non entri in collisione con nient'altro che stai usando e che non sia di uso comune altrove.
$ 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