nc(netcat)在UDP模式下挂起,等待更多数据。


16

我正在尝试在读取块内通过nc向statsd发送一个小字符串:

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

不幸的是,在UDP模式下,即使我已指定nc,nc似乎也希望无限期等待-q 0,该手册页上的内容将使程序在EOF之后立即退出。

我尝试过传递-w 1,但是如果我发送的数据每秒以多于一行的速度输入,则数据会缓冲起来,并且我会丢失实时统计信息(更不用说冒着某种类型的缓冲区溢出的风险了)。

是否可以使用netcat进行我想做的事情,还是我需要用具有statsd库的语言编写某些内容?


尽管它不能解决您的问题,但添加-q 0解决了我的问题
Colin 16'4

现在这是在TCP模式下发生的,这就是我来到这里的原因。
baitisj

Answers:


9

我最终通过切换到解决这个问题socat

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

由于没有其他输入,并且这解决了我的问题,因此将其标记为答案。
bshacklett

您可能已经向netcat添加了1秒超时(添加参数-w 1可能会起作用)。
parkamark

7

您可以将0指定为-w的超时值,因此它根本不会等待。


这应该是公认的答案。
Petrus K.

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
Noah Sussman

0

对于我们来说,这是我们正在通过python脚本将nc有效负载从一台计算机发送到另一台计算机。在python中,当我们将有效负载明确编码为“ UTF-8”时,它就可以正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.