Como liberar uma porta TCP?

4

Eu tenho algum código que ouve uma porta TCP específica. No entanto, quando eu parar este código e reiniciá-lo rapidamente depois, vejo o erro

ERROR: could not bind to socket on 0.0.0.0:7700

Se eu esperar um minuto ou mais, de repente esta porta está "livre" e o código é executado novamente.

Minha pergunta: Existe uma maneira de forçar essa porta específica 'free'? Para poder iniciar meu código imediatamente, sem esperar um minuto ou mais?

    
por Alex 29.08.2013 / 15:19

1 resposta

5

Você pode usar SO_REUSEADDR

int optval = 1;
/* create socket using socket */
setsockopt(s1, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
/* bind socket */

Você obtém esse erro porque o protocolo TCP força o servidor a colocar o soquete que você acabou de fechar no status TIME_WAIT pelo tempo definido em net.ipv4.tcp_fin_timeout . Isso é para garantir que, na verdade, todos os pacotes que o outro peer possa ter enviado após o servidor ter fechado o soquete ainda estejam sendo manipulados corretamente.

Aqui está uma boa descrição desse problema na primeira resposta do tópico: Qual é o significado de SO_REUSEADDR (opção setsockopt) - Linux? .

    
por 29.08.2013 / 15:29