我正在尝试使用nc
UDP 将消息流从一台服务器发送到另一台服务器。在发送端 Centos 7.5,我正在执行以下操作:
for s in $( seq 1 20 )
do
echo "$(date +'%Y-%m-%d %H:%M:%S') Hello - ${s}" | nc -u <receiver-ip> <port_no>
echo ${s}
sleep 2
done
在监听端,我正在运行 Debian 10 VM,以监听以下消息:
nc -u -l -p <port-no>
我检查过该端口未被使用,事实上,当我运行发送程序时,我可以看到每两秒输出一次计数。然而,在接收端,我最初收到以下内容:
2021-04-13 05:26:29 Hello 1
但之后,我再也没有收到任何消息,尽管nc
它并没有终止。为了清楚起见,我理想情况下希望在接收器上看到 20 条这样的消息,与发送的消息一致。
我确信造成这种情况的原因很简单,但我已经阅读了每个平台上的手册页(顺便说一下,发送方正在运行Ncat 7.50
,接收方正在运行nc [v1.10-41.1]
),尽管进行了各种尝试,但还是无法让它工作。
有人能解释为什么这没有发生吗?
答案1
-listener 收到第一个数据包后nc
,它会在套接字上调用 connect() 以将其永久关联到它刚刚看到的远程端点(发送方主机:端口)。这样就可以nc
使用其标准 read() 循环,而不是特定于 UDP 的 recvfrom()。
但是,每次调用nc
-sender 都会使用新的套接字,因此会使用不同的临时源端口。接收套接字会忽略数据包,因为它明确“连接”到了不同的地址。
为了避免这种情况,您可以使用-p
选项在发送者身上始终指定固定的源端口。
或者,由于您基本上是试图重新发明 UDP-syslog,您可能应该只使用 syslog 守护进程(例如 syslog-ng 或 rsyslogd)并将其配置为将消息发送到 UDP 接收器。