我正在尝试通过 发送消息netcat
。发送消息后,netcat
必须终止。
我尝试过以下方法:
cat tsmmessage.bin | nc -u localhost 4300
nc -u localhost 4300 < message.bin
该-q
选项指出:
-q 秒
在 stdin 上的 EOF 后,等待指定的秒数,然后退出。如果秒为负数,则永远等待。
但
nc -q0 -u localhost 4300 < message.bin
也不起作用。
我缺少什么?
答案1
假设发送 EOF 连接后将保持空闲状态,您可以使用-w timeout
选项,该选项timeout
等于零(与愚蠢的-q
选项不同......)
cat tsmmessage.bin | nc -u localhost 4300 -w0
答案2
如果没有该-q
标志,您的实例netcat
将永远等待。 UDP 没有“流结束”消息,因此无法netcat
知道两者标准输入并且网络连接已完成。
例如,使用 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
答案3
UDP协议
# listen on receiver
nc -u -l localhost -p 4300
# sender
cat tsmmessage.bin | nc -u -N -q 0 localhost 4300
TCP协议
# listen on receiver
nc -l localhost -p 4300
# sender
cat tsmmessage.bin | nc -N localhost 4300
编辑:该解决方案适用于
openbsd-netcat
根据评论,并且不适GNU Netcat
用于Archlinux
答案4
一个相当可移植的选项是将 SIGHUP 发送到 的客户端实例nc
。例子:
kill -1 <pid of nc>
或者
pkill -1 nc
如果数据流已经完成并且您需要彻底关闭连接但 nc 仍在运行,这也适用。这可能发生在由于可移植性问题而无法关闭的环境中。