nc (netcat) зависает, ожидая больше данных, в режиме UDP.


16

Я пытаюсь отправить небольшую строку в statsd через nc внутри блока чтения:

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

К сожалению, когда в режиме UDP nc, кажется, хочет ждать бесконечно, хотя я и указал -q 0, что, по словам справочной страницы, программа завершит работу сразу после EOF.

Я попытался передать -w 1, но если данные, которые я посылаю, поступают со скоростью более одной строки в секунду, данные буферизуются, и я теряю свою статистику в реальном времени (не говоря уже о риске переполнения буфера какого-то рода).

Можно ли сделать то, что я пытаюсь сделать с netcat, или мне нужно написать что-то на языке, который имеет библиотеку statsd?


хотя это не решило вашу проблему, добавление -q 0 решило мою проблему
Колин

Теперь это происходит в режиме TCP, что и привело меня сюда.
baitisj

Ответы:


9

Я решил проблему, переключившись на socat:

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

Поскольку не было никакого другого ввода, и это решило мою проблему, я отмечаю это как ответ.
bshacklett

Вы могли бы добавить 1 секунду для netcat (добавление аргументов -w 1, вероятно, сработало бы).
Parkamark

7

Вы можете указать 0 в качестве значения тайм-аута для -w, поэтому он вообще не будет ждать.


Это должен быть принятый ответ.
Петрус К.

3
Нулевой тайм-аут недопустим, ошибка:invalid wait-time 0
AstraSerg

2

добавление опции -v решило мою проблему. Причина, по которой я не уверен.


2

У меня была такая же проблема; решил это с помощью -cопции:

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

так что-то вроде

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

Да, на самом деле не имеет смысла «закрывать» udp-соединение - но это сработало.


Добавление -cрешило мою проблему сnetcat (The GNU Netcat) 0.7.1
Ноа Суссманом

0

Для нас это было то, что мы отправляли полезную нагрузку nc с одной машины на другую через скрипт python. В питоне, когда мы явно кодировали полезную нагрузку в 'UTF-8', это просто работало.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.