UDP协议

UDP协议

我正在尝试通过 发送消息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 仍在运行,这也适用。这可能发生在由于可移植性问题而无法关闭的环境中。

相关内容