我想这接近linux – Netcat 停止监听 UDP 流量,但我觉得我还是应该问一下
据,直到...为止netcat 的版本我正在使用 Ubuntu 11.04 及其默认版本netcat
,我猜测它是openbsd
:
$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
[-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
[-x proxy_address[:port]] [hostname] [port[s]]
这就是我觉得奇怪的地方:第一种情况按预期工作——我在一个终端中打开一个 UDP 服务器:
$ sudo nc -ul 5000
...在另一个终端中我启动了一个新的 UDP 客户端连接 - 我输入了hello
三次,每次之后都按 ENTER 键:
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
...回到服务器终端,它打印了hello
三次,正如预期的那样:
$ sudo nc -ul 5000
hello
hello
hello
^C
到目前为止一切顺利,一切都按预期进行。但是,假设我现在尝试通过将输入管道传输到客户端来实现相同的目的;因此首先在一个终端中建立一个 UDP 服务器:
$ sudo nc -ul 5000
... 在另一个客户端中,将一些数据传输到nc
UDP 客户端:
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
... 在客户端命令之后,shell 有点冻结,好像在等待输入 - 因此我hello
又输入了两次并按了 ENTER;但服务器只注册了第一次hello
(通过管道传输echo
)。此外,即使您按 Ctrl-C 并尝试重复客户端echo hello | nc -u 127.0.0.1 5000
命令,服务器也会仍然继续报道第一个hello
:
$ sudo nc -ul 57130
hello
^C
...并且只有在使用 Ctrl-C 停止服务器并重新启动它之后,才能重复客户端echo hello | nc -u 127.0.0.1 5000
命令并观察其运行情况。
这是应该采取的行为方式吗nc
?我希望至少重复调用会echo hello | nc -u 127.0.0.1 5000
被记录下来——而无需重新启动服务器?或者也许有专门的命令行开关用于这种行为?
编辑:我发现了这个很好的 PDF 演示文稿:socat – 处理所有类型的套接字,其中包含以下netcat
vssocat
注释:
netcat - 限制
● 仅限一次性(套接字关闭后终止)
...
示例 1:netcat 替换
...
● 源端口为 UDP 客户端:
nc -u -p 500 1.2.3.4 500
socat - udp:1.2.3.4:500,sp=500
● TCP 服务器:
nc -l -p 8080
socat - tcp-l:8080,reuseaddr
...
...但是,如果我用“ ”替换服务器命令socat - udp4-listen:5000,reuseaddr
- 并用“ ”替换客户端行socat - udp:127.0.0.1:5000
...使用管道输入“ echo hello | socat - udp:127.0.0.1:5000
”,唯一的区别是这里的命令至少在单词hello
发送后存在 - 但是,再次,连续运行此命令不会导致服务器接收,直到服务器重新启动。
答案1
好的,我认为至少我得到了一些东西socat
- 即,选项fork
需要附加到服务器行:
$ socat - udp4-listen:5000,reuseaddr,fork
...然后,在另一个终端中,我们可以在命令行上多次echo
调用管道进入客户端行,因为它将立即退出(socat
嗯,过了半秒钟:)):
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
$ echo "hello" | socat - udp-sendto:127.0.0.1:5000
...回到第一个终端,我们可以看到服务器已成功显示所有三个hello
:
$ socat - udp4-listen:5000,reuseaddr,fork
hello
hello
hello
^C
请注意,即使使用fork
-edsocat
服务器,该行echo "hello" | nc -u 127.0.0.1 5000
仍将“锁定”,就像等待用户输入一样;但是,现在按 Ctrl-C 并重新运行该命令后,即
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
$ echo "hello" | nc -u 127.0.0.1 5000
^C
...- fork
edsocat
服务器将显示三个hello
s,而无需重新启动..
看起来,这个 openBSDnetcat
没有fork
选项 - 但我不确定它是否有与之对应的选项。
无论如何,希望这对某人有帮助,
干杯!
答案2
当您使用管道时,您的 netcat 只会读取 echo 的标准输出,它不再“连接”到键盘。要获得您期望的响应,您可以将三个“hello”添加到文件中并运行
cat [myfile] | nc -u 127.0.0.1 5000
答案3
如果您对正在监听的 nc 进行 strace,它将显示 netcat 正在等待连接,一旦它获得连接,就会连接到该主机和端口,忽略所有其他主机和端口。您需要添加“-k”以继续运行,并添加“-w 0”以在 0 秒后使每个连接超时。我认为 Socat 是更好的选择。