Quais são as semânticas de obter um EADDRINUSE quando nenhum soquete de escuta está ligado, mas as conexões estão abertas

2

Considere um processo pai que conclua um socket/bind/accept e que bifurque os filhos com esse soquete aberto para que eles se comuniquem, enquanto o pai continua aceitando conexões. Esse processo pai é então morto.

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 esse processo com sshd , parece que sshd é capaz de religar à porta que foi fechada, enquanto durante a janela de reinicialização (em que o processo pai sshd é não executando), um programa diferente (executado como um usuário diferente) apenas obtém EADDRINUSE.

Quais são as semânticas por trás disso? Por que sshd pode ser religado, mas outro processo de usuários não pode?

Além disso, posso confirmar que a saída netstat -a | grep PORT durante o tempo em que o processo filho está sendo executado (quando o outro processo não pode bind ), a única conexão é ESTABLISHED one, nenhum em LISTEN state.

    
por ss23 14.10.2014 / 13:18

1 resposta

0

Embora eu não entenda toda a semântica (estou procurando no lugar errado ou faltando a documentação), acredito que por um certo tempo após fechar uma conexão (talvez definida por SO_LINGER ), nenhum processo pode abrir um novo socket com os mesmos detalhes, a menos que eles tenham SO_REUSEADDR set.

Isso evita que alguém reconecte um segundo depois que uma conexão é fechada e o processo tendo que lidar com pacotes que foram feitos para o processo anterior, como eu o entendo.

man 7 socket não documenta isso como parte de SO_REUSEADDR , o que dificultou essa resposta.

    
por 22.10.2014 / 08:44

Tags