Netcat:UDP 连接不会终止?

Netcat:UDP 连接不会终止?

一个简单的例子,这是我的服务器/主机:

nc -ul 192.168.0.2 54 

和客户:

echo "test" | nc -u 192.168.0.2 54

服务器将拦截“test”消息,但nc不会关闭。它一直保持打开状态,直到我按 Enter 或 Ctrl+c。可以让它自动终止吗?或者也许在客户端消息中包含一些内容来表示传输已结束?

nc --version
Ncat: Version 7.70 ( https://nmap.org/ncat )

我正在使用 Debian 和 macOS。

答案1

TCP 有一个有开始和结束的连接概念,而 UDP 则没有。 UDP 是一个无连接协议:UDP 接收器只是等待指定 UDP 端口中的传入数据包,并输出任何到达的 UDP 数据包的内容。

接收方nc不知道可能有多少数据包传入,也不知道这些数据包是否应该全部来自同一主机或来自多个主机:它只是接收到达指定 UDP 端口的任何内容并输出 UDP 的内容将数据包发送到标准输出,而不以任何方式解析它,直到nc进程中断。

甚至没有任何内置的保证来保证客户端/发送方发送的任何数据包在接收端都以相同的顺序接收:数据包可能会在途中丢失或重新排序。 UDP 没有尝试解决这个问题:使用 UDP 来处理所有这些问题(或忽略它们)以适合其目的。

您可以决定一个特定的字符串,使其表示“数据结束”,并在侦听端安排另一个脚本来解析传入的数据,并nc在收到该字符串时终止侦听进程。这样,您将开始在 UDP 之上构建您自己的(可能非常简单)协议。这正是 UDP 的设计目的。

简而言之,“是否有可能nc -ul自动终止?”的答案。是“不,除非你做了一些能做到这一点的东西。”

答案2

netcat有选项-W

-W recvlimit    Terminate after receiving a number of packets

所以:

nc -ulW 1 192.168.0.2 54

但你正在使用ncat.您可以使用此解决方法:

nc -ul 192.168.0.2 54 -c 'dd count=1 bs=100000 >&3' 3>&1

相关内容