Cuando configura una conexión TCP, la 4-tupla (source-ip, source-port, dest-ip, dest-port) tiene que ser única; esto es para garantizar que los paquetes se entreguen en el lugar correcto.
Existe una restricción adicional en el lado del servidor de que solo un programa de servidor puede vincularse a un número de puerto entrante (asumiendo una dirección IP; los servidores de múltiples NIC tienen otros poderes, pero no es necesario que los analicemos aquí).
Entonces, en el extremo del servidor, usted:
- crear un enchufe.
- enlazar ese socket a un puerto.
- escucha en ese puerto.
- aceptar conexiones en ese puerto. y puede haber varias conexiones (una por cliente).
En el lado del cliente, generalmente es un poco más simple:
- crear un enchufe.
- abre la conexión. Cuando un cliente abre la conexión, especifica la dirección IP y el puerto del servidor . Se puede especificar su puerto de origen, pero por lo general utiliza cero, lo que da como resultado el sistema le asigna un puerto libre de forma automática.
No existe ningún requisito de que la IP / puerto de destino sea único, ya que eso daría como resultado que solo una persona a la vez pudiera usar Google, y eso destruiría bastante bien su modelo de negocio.
Esto significa que incluso puede hacer cosas tan maravillosas como FTP de múltiples sesiones, ya que configura varias sesiones donde la única diferencia es su puerto de origen, lo que le permite descargar fragmentos en paralelo. Los torrents son un poco diferentes porque el destino de cada sesión suele ser diferente.
Y, después de todo ese parloteo (lo siento), la respuesta a su pregunta específica es que no necesita especificar un puerto libre. Si se está conectando a un servidor con una llamada que no especifica su puerto de origen, es casi seguro que usará cero debajo de las cubiertas y el sistema le dará uno sin usar.