Considere um processo pai que completa um socket/bind/accept
e bifurcará os filhos com esse soquete aberto para eles se comunicarem, enquanto o pai continua aceitando conexões. Esse processo pai é então eliminado.
Outro processo agora tenta vincular-se ao mesmo endereço ao qual o processo pai estava vinculado, na mesma porta, mas recebe um erro EADDRINUSE.
No entanto, quando você conclui este processo com sshd
, parecesshd
écapaz de religar à porta que foi fechada, enquanto durante a janela de reinicialização (onde o processo pai sshd não está em execução), um programa diferente (executando como um usuário diferente) apenas obtém EADDRINUSE.
Qual é a semântica por trás disso? Por que pode ser sshd
religado, mas o processo de outro usuário não pode?
Além disso, posso confirmar que a netstat -a | grep PORT
saída durante o tempo em que apenas o processo filho está em execução (quando o outro processo não pode bind
), a única conexão é ESTABLISHED
aquela, nenhuma no LISTEN
estado.
Responder1
Embora eu não entenda toda a semântica (ou estou procurando no lugar errado ou falta documentação), acredito que por um certo período de tempo após fechar uma conexão (talvez definida por SO_LINGER
), nenhum processo pode abra um novo soquete com os mesmos detalhes, a menos que eles tenham sido SO_REUSEADDR
configurados.
Isso evita que alguém se reconecte um segundo após o fechamento da conexão e o processo tenha que lidar com pacotes que foram destinados ao processo anterior, pelo que entendi.
man 7 socket
não documenta isso, o SO_REUSEADDR
que tornou essa resposta difícil de descobrir.