Você está fazendo a pergunta errada aqui. Não é realmente possível simplesmente "fechar uma porta" de fora do aplicativo que abriu o soquete. A única maneira de fazer isso é matar completamente o processo que possui a porta. Então, em cerca de um minuto ou dois, a porta ficará disponível novamente para uso. Aqui está o que está acontecendo (se você não se importa, pule para o final, onde eu mostro como eliminar o processo que possui uma porta específica):
Portas são recursos alocados pelo sistema operacional para diferentes processos. Isso é semelhante a pedir ao sistema operacional um ponteiro de arquivo. No entanto, diferentemente dos ponteiros de arquivo, apenas UM processo de cada vez pode possuir uma porta. Por meio da interface do soquete BSD, os processos podem solicitar uma escuta em uma porta, que o sistema operacional concederá. O sistema operacional também garantirá que nenhum outro processo obtenha a mesma porta. A qualquer momento, o processo pode liberar a porta fechando o soquete. O sistema operacional recuperará a porta. Como alternativa, se o processo terminar sem liberar a porta, o sistema operacional acabará por recuperá-la (embora isso não aconteça imediatamente: levará alguns minutos).
Agora, o que você deseja fazer (basta fechar a porta na linha de comando) não é possível por dois motivos. Primeiro, se fosse possível, isso significaria que um processo poderia simplesmente roubar o recurso de outro processo (a porta). Isso seria uma política ruim, a menos que restrito a processos privilegiados. A segunda razão é que não está claro o que aconteceria com o processo que possuía a porta se a deixássemos continuar em execução. O código do processo é escrito assumindo que ele possui esse recurso. Se simplesmente o retirássemos, ele acabaria travando por conta própria, para que os sistemas operacionais não o deixem fazer isso, mesmo que você seja um processo privilegiado. Em vez disso, você deve simplesmente matá-los.
De qualquer forma, veja como matar um processo que possui uma porta específica:
sudo netstat -ap | grep :<port_number>
Isso produzirá a linha correspondente à porta de retenção do processo, por exemplo:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
Nesse caso, procHoldingPort é o nome do processo que abriu a porta, 4683 é seu pid e 8000 (observe que é TCP) é o número da porta que possui.
Então, olhe na última coluna, você verá /. Em seguida, execute o seguinte:
kill <pid>
Se isso não funcionar (você pode verificar executando novamente o comando netstat). Fazem isto:
kill -9 <pid>
Em geral, é melhor evitar o envio de SIGKILL, se puder. É por isso que eu digo para você tentar kill
antes kill -9
. Apenas usar kill
envia o SIGTERM mais suave.
Como eu disse, ainda levará alguns minutos para a porta reabrir se você fizer isso. Não sei como acelerar isso. Se alguém o fizer, eu adoraria ouvir.