Você deve usar a opção -k
. nc -lk 3333
Como afirmado por man nc
-k Forces nc to stay listening for another connection after its current
connection is completed. It is an error to use this option without the
-l option.
Editar:
Observe que eu e meu camarada aqui postamos a mesma resposta perto de simultaneamente. ( Como a mente daquele:) ) - Para não ser completamente redundante, estou adicionando uma amostra usando -k
e não.
Primeiro:
Eu sei que se eu iniciar nc -l porta sem o loop while ele permanece aberto e eu posso conversar entre as duas conexões, até mesmo desconectar do host conectado.
Este não é o caso para mim. Fecha após uma mensagem.
Segundo:
Eu diria que -k
, como é empacotado com o software e funciona bem, seria o melhor caminho a percorrer. No entanto, também é possível envolvê-lo em um loop eterno.
Usando -v
para obter mais informações.
#!/bin/bash
nc1()
{
nc -lkv $port |
while read msg; do
if [[ "$msg" =~ ^(q|quit|x|exit|halt)$ ]]; then
printf ";; Received shut down signal \'%s'\n" "$msg"
# Hack to terminate
printf "\n" | nc localhost $port &
break
fi
printf "MSG: %s\n" "$msg"
done
}
nc2()
{
while true; do
msg=$(nc -lv $port)
if [[ "$msg" =~ ^(q|quit|x|exit|halt)$ ]]; then
printf ";; Received shut down signal \'%s'\n" "$msg"
break
fi
printf "MSG: %s\n" "$msg"
done
}
port=3333
fun=nc1
while [[ "" ]]; do
case "" in
1) fun=nc1;;
2) fun=nc2;;
p) port=""; shift;;
*) printf "Unknown option \'%s'\n" ""
esac
shift
done
$fun
E em outra sessão:
printf "hello.\nHow are you?\n" | nc localhost 3333; sleep 1; printf "Good bye.\n" | nc localhost 3333; sleep 1; printf "x\n" | nc localhost 3333
Indo um pouco além do escopo da questão; mas pode ser relevante em alguns casos:
Se você usar alguma ferramenta de despejo, por exemplo, sudo tcpdump -i lo -vvv -w nc.cap
, perceberá que o resultado é:
Mensagem "Olá. \ nComo você está? \ n":
1. TCP-connection; three-way handshake:
Client send SYN
Server responds SYN, ACK
Client responds ACK
2. DATA
Client send ACK, PUSH + message
Server responds ACK
3. TCP-termination; three-way handshake:
Client send ACK, FIN
Server responds ACK, FIN
Client send ACK