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
EOFno stdin, quando executado com o argumento-N - após
EOFno 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 2000Depois de enviar
hello, o servidor encontraEOFno stdin an enviaFINdevido a-N.O cliente recebe a mensagem e, devido a
-d, vêEOFno 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 2000O servidor mantém a conexão aberta após
EOFno stdin.O cliente vê
EOFno stdin e enviaFIN, por causa de-N.O servidor envia
FINapós receber oFINdo cliente.A conexão está fechada, tanto o cliente quanto o servidor saem.