Si no puede predecir el tipo exacto de entorno en el que se ejecutará su aplicación, simplemente no se moleste con esto. Elija cualquier número por encima de 1024 y también hágalo configurable para que el usuario pueda cambiarlo en caso de conflicto con otro servicio/aplicación.
Por supuesto, aún puede evitar puertos muy comunes como 8080 (HTTP alternativo) o 3128 (proxies como squid), 1666 (forzosamente), etc. Puede consultar una lista completa de puertos conocidos aquí, o echar un vistazo a /etc/services .
Si no le importa el número de puerto, y no le importa que cambie cada vez que se ejecuta su programa, simplemente no vincule el puerto antes de escucharlo (o vincule con el puerto 0, si desea vincular una dirección IP específica). En ambos casos, le está diciendo al sistema operativo que elija un puerto libre para usted.
Después de comenzar a escuchar, use getsockname
para averiguar qué puerto se eligió. Puede escribirlo en un archivo, mostrarlo en la pantalla, hacer que un niño lo herede a través de fork
, etc.
Para una aplicación estática, considere verificar /etc/services
para encontrar un puerto que no colisione con nada más que esté usando y que no sea de uso común en otros lugares.
$ 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