Eu também estava intrigado com o comportamento do netcat, então eu procurei o código. Aqui está a história toda:
Os servidores nc ( nc -l
) e os clientes só saem depois que a conexão mútua foi fechada. Ou seja, se cada uma das partes enviou um pacote FIN para a outra parte.
Um servidor sempre envia um pacote FIN
após receber um pacote FIN
do cliente. (A menos que o servidor já tenha enviado um pacote FIN
.)
Um cliente envia um pacote FIN:
- após
EOF
no stdin, quando executado com o argumento-N
- após
EOF
no stdin, quando o servidor já enviou um pacote FIN
A opção -d
sempre implica EOF
no stdin.
A opção -N
sempre implica em enviar FIN
depois de encontrar EOF
no stdin.
Formas de sair dos processos nc após a troca de dados:
-
Resposta de Georg
server$ echo hello | nc -l -N 2000 client$ nc -d localhost 2000
Depois de enviar
hello
, o servidor encontraEOF
no stdin an enviaFIN
devido a-N
.O cliente recebe a mensagem e, devido a
-d
, vêEOF
no stdin e enviaFIN
, porque o servidor já enviouFIN
.A conexão está fechada, tanto o cliente quanto o servidor saem.
-
O cliente inicia o fechamento
server$ echo hello | nc -l 2000 client$ nc -dN localhost 2000
O servidor mantém a conexão aberta após
EOF
no stdin.O cliente vê
EOF
no stdin e enviaFIN
, por causa de-N
.O servidor envia
FIN
após receber oFIN
do cliente.A conexão está fechada, tanto o cliente quanto o servidor saem.