Immagino che questo sia vicino a Linux - Netcat smette di ascoltare il traffico UDP - Super User , ma ho pensato che sarebbe meglio chiedere comunque
Per quanto riguarda le versioni di netcat sto usando Ubuntu 11.04 e il valore predefinito netcat
su di esso, che suppongo sia openbsd
quello:
$ 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]]
Questo è ciò che trovo strano: il primo caso funziona come previsto - Apro un server UDP in un terminale:
$ sudo nc -ul 5000
... e in un altro terminale avvio una nuova connessione client UDP - e scrivo hello
tre volte, premendo INVIO dopo ciascuna:
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
... e tornando al terminale del server, ha stampato hello
tre volte, come previsto:
$ sudo nc -ul 5000
hello
hello
hello
^C
Fin qui tutto bene, tutto funziona come previsto. Tuttavia, supponiamo che provo ora lo stesso eseguendo il piping dell'input nel client; quindi stabilire prima un server UDP in un terminale:
$ sudo nc -ul 5000
... e in un altro, reindirizza alcuni dati nc
come client UDP:
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
... dopo il comando client, la shell si blocca come se fosse in attesa di input - quindi lì scrivo hello
e INVIO altre due volte; ma il server ha registrato solo il primo hello
(che è stato reindirizzato tramite echo
). Inoltre, anche se si preme Ctrl-C e si tenta di ripetere il echo hello | nc -u 127.0.0.1 5000
comando client , il server rimarrà comunque dopo aver segnalato solo il primo hello
:
$ sudo nc -ul 57130
hello
^C
... e solo dopo aver arrestato il server con Ctrl-C e averlo riavviato, è possibile ripetere il echo hello | nc -u 127.0.0.1 5000
comando client e osservarlo mentre funziona.
È così nc
dovrebbe comportarsi? Mi aspetto che echo hello | nc -u 127.0.0.1 5000
vengano registrate almeno le chiamate ripetute senza dover riavviare il server? O forse c'è uno speciale interruttore da riga di comando per quel tipo di comportamento?
EDIT: Ho trovato questa bella presentazione in PDF: socat - Gestione di tutti i tipi di socket , che contiene il seguente netcat
vssocat
note :
netcat - Limitazioni
● solo uno scatto (termina dopo la chiusura del socket)
...
Esempi 1: Sostituzione netcat
...
● Client UDP con porta sorgente:
nc -u -p 500 1.2.3.4 500
socat - udp: 1.2.3.4: 500, sp = 500
● Server TCP:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...
... tuttavia, sto praticamente ottenendo lo stesso comportamento di cui sopra, se sostituisco il comando server con " socat - udp4-listen:5000,reuseaddr
" - e la riga client con " socat - udp:127.0.0.1:5000
" ... Con l'input convogliato " echo hello | socat - udp:127.0.0.1:5000
", l'unica differenza è che qui il comando esiste almeno dopo che la parola è hello
stata inviata - tuttavia, ancora una volta, esecuzioni consecutive di questo comando non causeranno alcuna ricezione sul server, fino al riavvio del server.
cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000
"), tuttavia, mentre vedo trehello
s, ciò che mi confonde è ancora presente: anche quel comando ordinerà un po' di "blocco", come se aspettassi l'input digitato da utente, e dopo aver premuto Ctrl-C e rieseguendolo, il server non vedrà alcun dato finché non verrà riavviato !? Questo è quello che mi piacerebbe sapere di più: evviva!