nc (netcat) se bloque, attendant plus de données, en mode UDP.

16

J'essaie d'envoyer une petite chaîne à statsd via nc à l'intérieur d'un bloc de lecture:

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

Malheureusement, en mode UDP, nc semble vouloir attendre indéfiniment, même si je l'ai spécifié -q 0, ce qui, selon la page de manuel, fera quitter le programme immédiatement après EOF.

J'ai essayé de passer -w 1, mais si les données que j'envoie arrivent à plus d'une ligne par seconde, les données se tamponnent et je perds mes statistiques en temps réel (sans parler de risquer un débordement de tampon d'une certaine sorte).

Est-il possible de faire ce que j'essaie de faire avec netcat, ou vais-je avoir besoin d'écrire quelque chose dans un langage qui a une bibliothèque statsd?

bshacklett
la source
bien qu'il n'ait pas résolu le vôtre, l'ajout de -q 0 a résolu mon problème
Colin
Cela se produit maintenant en mode TCP, ce qui m'a amené ici.
baitisj

Réponses:

9

J'ai fini par résoudre le problème en passant à socat:

while read line; do
    printf "folder.counter:value|1c" | socat -t 0 - UDP:$host:$port
done
bshacklett
la source
Comme il n'y a eu aucune autre entrée, et cela a résolu mon problème, je le marque comme la réponse.
bshacklett
Vous auriez pu ajouter un délai d'attente de 1 seconde à netcat (l'ajout des arguments -w 1 aurait probablement fonctionné).
parkamark
7

Vous pouvez spécifier 0 comme valeur de délai d'expiration à -w, donc il n'attendra pas du tout.

Dániel
la source
Cela devrait être la réponse acceptée.
Petrus K.
3
Le délai d'attente invalid wait-time 0
nul
2

l'ajout de l'option -v a résolu mon problème. La raison pour laquelle je ne suis pas sûr.

Kousha
la source
2

J'ai eu le même problème; résolu en utilisant l' -coption:

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

donc quelque chose comme

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

Ouais, ça n'a pas vraiment de sens de "fermer" une connexion udp - mais cela a fini par fonctionner.

Jørn Christensen
la source
L'ajout a -crésolu mon problème avecnetcat (The GNU Netcat) 0.7.1
Noah Sussman
0

Pour nous, c'était que nous envoyions une charge utile nc d'une machine à une autre via un script python. Dans le python, lorsque nous avons explicitement encodé la charge utile en 'UTF-8', cela a juste fonctionné.

user1118473
la source