nc (netcat) si blocca, in attesa di ulteriori dati, in modalità UDP.


16

Sto cercando di inviare una piccola stringa a statsd tramite nc all'interno di un blocco di lettura:

while read line; do
    printf "folder.counter:value|1c" | nc -q 0 -u $host $port
done

Sfortunatamente, quando in modalità UDP, nc sembra voler aspettare indefinitamente, anche se ho specificato -q 0, che la pagina man dice farà uscire il programma immediatamente dopo EOF.

Ho provato a passare -w 1, ma se i dati che sto inviando arrivano a più di una riga al secondo, i dati si bufferizzano e perdo le mie statistiche in tempo reale (per non parlare del rischio di un overflow del buffer di qualche tipo).

È possibile fare ciò che sto cercando di fare con Netcat o avrò bisogno di scrivere qualcosa in una lingua che abbia una libreria statsd?


sebbene non abbia risolto il tuo, l'aggiunta di -q 0 ha risolto il mio problema
Colin

Questo succede ora in modalità TCP, che è ciò che mi ha portato qui.
Baitisj,

Risposte:


9

Ho finito per risolvere il problema passando a socat:

while read line; do
    printf "folder.counter:value|1c" | socat -t 0 - UDP:$host:$port
done

Non essendoci altri input e questo ha risolto il mio problema, lo segnerò come risposta.
bshacklett,

Avresti potuto aggiungere un timeout di 1 secondo a netcat (aggiungendo gli argomenti -w 1 probabilmente avrebbe funzionato).
Parkamark,

7

Puoi specificare 0 come valore di timeout su -w, quindi non aspetterà affatto.


Questa dovrebbe essere la risposta accettata.
Petrus K.,

3
Il timeout zero è inaccettabile, l'errore:invalid wait-time 0
AstraSerg

2

l'aggiunta dell'opzione -v ha risolto il mio problema. Il motivo non sono sicuro.


2

Ho avuto lo stesso problema; risolto usando l' -copzione:

-c, --close                close connection on EOF from stdin

quindi qualcosa del genere

while read line; do
    printf "folder.counter:value|1c" | nc -cu $host $port
done

Sì, non ha davvero senso "chiudere" una connessione udp, ma alla fine ha funzionato.


Aggiunta -crisolto il mio problema connetcat (The GNU Netcat) 0.7.1
Noah Sussman,

0

Per noi, è stato che stavamo inviando un payload nc da una macchina all'altra tramite uno script Python. In Python, quando abbiamo codificato esplicitamente il payload in "UTF-8", ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.