Eu acho que isso é quase linux - o Netcat para de ouvir o tráfego UDP - Superusuário , mas achei melhor perguntar de qualquer maneira
No que diz respeito às versões do netcat , estou usando o Ubuntu 11.04 e o padrão netcat
, que acho que é o seguinte openbsd
:
$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
[-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
[-x proxy_address[:port]] [hostname] [port[s]]
Isso é o que acho estranho: o primeiro caso funciona como esperado - abro um servidor UDP em um terminal:
$ sudo nc -ul 5000
... e em outro terminal inicio uma nova conexão de cliente UDP - e digito hello
três vezes, pressionando ENTER após cada uma:
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
... e voltando ao terminal do servidor, ele foi impresso hello
três vezes, conforme o esperado:
$ sudo nc -ul 5000
hello
hello
hello
^C
Até aí tudo bem, tudo funciona como esperado. No entanto, digamos que eu tente agora o mesmo canalizando a entrada para o cliente; para estabelecer primeiro um servidor UDP em um terminal:
$ sudo nc -ul 5000
... e em outro, canalize alguns dados nc
como cliente UDP:
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
... após o comando do cliente, o shell congela como se estivesse esperando pela entrada - então digito hello
e ENTER mais duas vezes; mas o servidor registrou apenas o primeiro hello
(que foi canalizado via echo
). Além disso, mesmo se você pressionar Ctrl-C, e tentar repetir o cliente echo hello | nc -u 127.0.0.1 5000
comando, o servidor irá ainda permanecem em ter relatado apenas o primeiro hello
:
$ sudo nc -ul 57130
hello
^C
... e somente depois de parar o servidor com Ctrl-C e reiniciá-lo novamente, é possível repetir o echo hello | nc -u 127.0.0.1 5000
comando do cliente e observá-lo funcionando.
É assim que nc
deveria estar se comportando? Eu esperava que pelo menos as chamadas repetidas echo hello | nc -u 127.0.0.1 5000
fossem registradas - sem ter que reiniciar o servidor? Ou talvez haja uma opção de linha de comando especial para esse tipo de comportamento?
EDIT: Encontrei esta bela apresentação em PDF: socat - Manipulando todos os tipos de soquetes , que contém as seguintes notas netcat
vs socat
:
netcat - Limitações
● Apenas um tiro (termina após o fechamento do soquete)
...
Exemplos 1: Substituição do netcat
...
● Cliente UDP com porta de origem:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● Servidor TCP:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...
... no entanto, estou obtendo o mesmo comportamento acima, se eu substituir o comando do servidor por " socat - udp4-listen:5000,reuseaddr
" - e a linha do cliente por " socat - udp:127.0.0.1:5000
" ... Com a entrada canalizada " echo hello | socat - udp:127.0.0.1:5000
", a única diferença é que aqui o comando existe pelo menos depois que a palavra hello
foi enviada - no entanto, novamente, execuções consecutivas desse comando não causarão nenhuma recepção no servidor, até que o servidor seja reiniciado.
cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000
), no entanto, enquanto vejo trêshello
s, o que me intriga ainda está presente: esse comando também meio que "trava", como se estivesse esperando a entrada digitada de usuário, e depois de Ctrl-C e executá-lo novamente, o servidor não verá nenhum dado até que seja reiniciado !? É isso que eu gostaria de saber melhor - saúde!