web-dev-qa-db-fra.com

NC (NetCat) est suspendu, en attente de plus de données, en mode UDP.

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, lorsqu'il est en mode UDP, NC semble vouloir attendre indéfiniment, même si j'ai spécifié -q 0, que dit la page de l'homme fera la sortie du programme immédiatement après EOF.

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

Est-il possible de faire ce que j'essaie de faire avec Netcat ou que je vais devoir écrire quelque chose dans la langue qui a une bibliothèque StatsD?

16
bshacklett

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
9
bshacklett

Vous pouvez spécifier 0 comme une valeur de délai d'attente à -w, de sorte que cela n'attendra pas du tout.

8
Dániel

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

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

alors quelque chose comme

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

Oui, n'a pas vraiment de sens de "fermer" une connexion UDP - mais cela a fini de fonctionner.

2
Jørn Christensen

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

2
Kousha

Pour nous, c'était que nous envoyions une charge utile NC d'une machine à une autre via A python script. Dans le python, lorsque nous avons explicitement codé sur la charge utile dans "UTF-8", travaillé.

0
user1118473