Answers:
假设发送EOF连接后将保持空闲状态,则可以使用-w timeout
option,该选项的作用timeout
是等于0(与愚蠢的-q
option ... 不同)
cat tsmmessage.bin | nc -u localhost 4300 -w0
invalid wait-time 0
没有-q
标志,您的实例netcat
将永远等待。UDP没有“流结束”消息,因此没有办法netcat
知道stdin和网络连接均已完成。
例如,使用TCP / IP可以按预期工作:
nc -l localhost 4300 # Window 1
nc localhost 4300 </etc/group # Window 2
但是正如您所确定的,使用UDP / IP永远不会结束:
nc -u -l localhost 4300 # Window 1
nc -u localhost 4300 </etc/group # Window 2
这是-q
标志的出现位置。但是很遗憾,它不接受的值0
。它还将不接受非整数值。这是我可以不依靠timeout
其他外部实用程序而提供的最佳选择:
nc -u -l localhost 4300 # Window 1
nc -q 1 -u localhost 4300 </etc/group # Window 2
即使在这里,也无法netcat
优雅地暂停收听时间。(-w
超时选项将被忽略,并且-q
是无关紧要的。)在实际情况下,可能会使用到这种方法,因此netcat
90秒后将被杀死:
timeout 90 nc -u -l localhost 4300 # Window 1
nc -q 1 -u localhost 4300 </etc/group # Window 2
-q 0
为我工作。
谷歌搜索时几乎偶然发现了同样的问题。事实证明,问题是netcat在吸取所有数据后立即被bash杀死,而没有任何机会接收响应。
我对此的解决方案是在整理数据之后增加一些延迟,如下所示:
(echo INFO; sleep 1) | nc redis.service.consul 6379
使用文件,它看起来像:
(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300
netcat
完成后仍然无法关闭sleep
。我希望第一个命令行在1秒后返回到提示,但事实并非如此。
-q 1
?即(echo INFO; sleep 1) | nc -q 1 redis.service.consul 6379
?
-q
一切正常,甚至在我原来的问题的例子。从那时起,我已经转移到了较新版本的Ubuntu,也许这引起了差异。
-q
。