我正在尝试让 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 以防其他人可以在这里提供真正的解决方案。