我正在尝试通过 发送消息netcat
。发送消息后,netcat
必须终止。
我尝试了以下方法:
cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin
Run Code Online (Sandbox Code Playgroud)
该-q
选项指出:
-q 秒
在 stdin 上的 EOF 之后,等待指定的秒数,然后退出。如果秒为负,则永远等待。
但
nc -q0 -u localhost 4300 < message.bin
Run Code Online (Sandbox Code Playgroud)
也不起作用。
我错过了什么?
Bor*_*per 14
假设发送EOF连接后将保持空闲,您可以使用-w timeout
选项,该选项timeout
为零(与愚蠢的-q
选项不同......)
cat tsmmessage.bin | nc -u localhost 4300 -w0
Run Code Online (Sandbox Code Playgroud)
如果没有该-q
标志,您的实例netcat
将永远等待。UDP 没有“流结束”消息,因此无法知道netcat
标准输入和网络连接是否已完成。
例如,使用 TCP/IP 可以按预期工作:
nc -l localhost 4300 # Window 1
nc localhost 4300 </etc/group # Window 2
Run Code Online (Sandbox Code Playgroud)
但正如您所确定的,使用 UDP/IP 这永远不会结束:
nc -u -l localhost 4300 # Window 1
nc -u localhost 4300 </etc/group # Window 2
Run Code Online (Sandbox Code Playgroud)
这就是-q
标志发挥作用的地方。但不幸的是它不接受 值0
。它也不接受非整数值。这是我可以提供的最佳替代方案,无需求助于timeout
其他外部实用程序:
nc -u -l localhost 4300 # Window 1
nc -q 1 -u localhost 4300 </etc/group # Window 2
Run Code Online (Sandbox Code Playgroud)
即使在这里,也不可能netcat
优雅地结束监听时间。(-w
超时选项被忽略,并且-q
是无关紧要的。)类似这样的东西可能在实际情况中有用,因此netcat
在 90 秒后被杀死:
timeout 90 nc -u -l localhost 4300 # Window 1
nc -q 1 -u localhost 4300 </etc/group # Window 2
Run Code Online (Sandbox Code Playgroud)
小智 -1
当谷歌搜索几乎相同的问题时偶然发现了这一点。原来问题是netcat在所有数据被吸进去后就被bash杀死了,没有任何机会收到响应。
我的解决方案是在传输数据后添加一些延迟,如下所示:
(echo INFO; sleep 1) | nc redis.service.consul 6379
Run Code Online (Sandbox Code Playgroud)
对于文件,这可能看起来像:
(cat tsmmessage.bin; sleep 5) | nc -u localhost 4300
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
24789 次 |
最近记录: |