Quando você configura uma conexão TCP, a 4-tupla (ip-fonte, porta-fonte, ip-dest, porta-dest) deve ser única - isso é para garantir que os pacotes sejam entregues no lugar certo.
Há uma outra restrição no lado do servidor , de que apenas um programa de servidor pode se vincular a um número de porta de entrada (assumindo um endereço IP; os servidores multi-NIC têm outros poderes, mas não precisamos discuti-los aqui).
Então, na extremidade do servidor, você:
- crie um soquete.
- ligue esse soquete a uma porta.
- escute nessa porta.
- aceitar conexões nessa porta. e pode haver várias conexões chegando (uma por cliente).
No lado do cliente, geralmente é um pouco mais simples:
- crie um soquete.
- abra a conexão. Quando um cliente abre a conexão, ele especifica o endereço IP e a porta do servidor . Ele pode especificar sua porta de origem, mas geralmente usa zero, o que resulta na atribuição automática de uma porta livre pelo sistema.
Não há exigência de que o IP / porta de destino seja exclusivo, pois isso resultaria em apenas uma pessoa por vez ser capaz de usar o Google, e isso destruiria muito bem seu modelo de negócios.
Isso significa que você pode até fazer coisas maravilhosas como FTP de várias sessões, já que configura várias sessões em que a única diferença é sua porta de origem, permitindo que você baixe pedaços em paralelo. Torrents são um pouco diferentes porque o destino de cada sessão geralmente é diferente.
E, depois de todo aquele waffling (desculpe), a resposta à sua pergunta específica é que você não precisa especificar uma porta livre. Se você estiver se conectando a um servidor com uma chamada que não especifica sua porta de origem, quase certamente estará usando zero nos bastidores e o sistema fornecerá uma porta não utilizada.