Netcat UDP 服务器未发送响应

Netcat UDP 服务器未发送响应

我正在尝试让 OpenBSD netcat 监听特定端口 (3333) 和接口 (10.42.0.1) 上的 UDP 连接并发送固定响应。为了实现这一点,我这样做:

echo "asd" | nc -k -u -l -p 3333 -s 10.42.0.1 -v

然后我通过执行以下操作发送消息:

echo qwe | nc -u 10.42.0.1 3333 -v

输出为

# Server side
Bound on h9ct3d3 3333
XXXXXqwe

# Client side
Connection to 10.42.0.1 3333 port [udp/*] succeeded!

如您所见,客户端没有收到asd。但是,如果我删除-k,它就会收到它:

##### Server side
echo "asd" | nc -u -l -p 3333 -s 10.42.0.1 -v
Bound on h9ct3d3 3333
# ...
# Wait for the client to execute
# ...
Connection received on h9ct3d3 51318
XXXXXqwe

##### Client side
echo qwe | nc -u 10.42.0.1 3333 -v
# ...
# Wait for the above 'X'to finish
# ...
Connection to 10.42.0.1 3333 port [udp/*] succeeded!
asd

我曾尝试使用不带的 while 循环-k,但nc从未返回:

#!/bin/bash

while true
do
    echo "Host message" | nc -q 0 -u -l -p 3333 -s 10.42.0.1 -v
    echo "restarting..."
done

我怎样才能让它工作?

我的 netcat 版本是:

OpenBSD netcat (Debian patchlevel 1.206-1ubuntu1)

PD。为什么nc服务器会“发送”这些奇怪的X字符?客户端从不读取它们,只是等待它们完成。它们似乎每 1 秒显示一次。

答案1

服务器没有发送 X,客户端在前两个 X 之后每隔 1 秒发送一次,并且服务器显示器它们(应该如此)。如果你-v脱掉客户,X 未发送或显示,数据立即发送并显示(而不是 3 秒后)。我不知道为什么 -v意思是‘慢慢发送5X个字符’!

手册页-k

与 -u 选项一起使用时,服务器套接字未连接,并且可以接收来自多个主机的 UDP 数据报。

与此一致,使用时服务器-v会记录日志,但使用时不会记录日志。我Connection from {host} {port} received!-ul-ulk怀疑发送“响应”数据的代码依赖于套接字是否连接,因此如果不连接就会阻止响应,但我还没有深入研究源代码进行验证。

-q 0不会起作用,因为 UDP 中没有可检测的“连接结束”,而 TCP(FIN 交换)中有。如果您的客户端数据有可识别的内容(例如,head -1如果它始终是一行),那么从逻辑上讲,应该可以编写一些内容来识别该数据并终止nc允许循环迭代的进程,但我还没有找到一种干净的方法来获取nc此类识别器/终止程序可用的 pid。制作 CW 以防其他人可以在这里提供真正的解决方案。

相关内容