设想
我正在尝试将 UDP 数据报消息发送socat
到广播地址。
在接收端,这就是我的运行方式socat
(具有 root 权限):
socat UDP-LISTEN:1011 -
我尝试使用以下代码发送消息(具有 root 权限):
echo -n "test" | socat - UDP-DATAGRAM:255.255.255.255:1011,broadcast
观察到的行为
当使用低于 1025 的端口(特权端口等)时,广播数据报消息似乎会被丢弃。当我使用1024以上的端口时,它工作正常。
我还根据我的本地网络尝试了广播地址,但我观察到相同的行为,只有 1024 以上的端口接收数据报。
iptables
没有任何条目,这会妨碍接收方接收 UDP 消息。同样,发送端也没有条目。事实上,iptables -L
除了运行后预期的内容之外,不包含任何条目iptables -F
。
问题
这是标准行为吗?我应该简单地使用 >1024 的端口,或者我可以解决这个问题吗?在我的例子中,我想使用低于 1025 的端口。
答案1
这里所有示例都必须以 root 身份运行,因为我们正在考虑至少一个 <1024 的端口。
首先,我在发送服务器上设置了重复广播实用程序:
#!/bin/bash
while sleep 5
do
clear
date
echo
text="$((n++)): $(date)"
echo "Sending: $text"
for port in 1011 2022
do
socat - UDP-DATAGRAM:255.255.255.255:$port,broadcast <<<"$text on port $port"
echo "Sent on port $port"
done
done
该答案中的其余命令在不同的系统上运行,即接收客户端(在我的例子中是两个)。
文档 ( man socat
) 描述了UDP-LISTEN
对此进行了描述,“等待[即一个]UDP/IP 数据包到达并“连接”回[这]发件人“。这里的关键是它接受一个数据包。然后它等待响应(在标准输入),它尝试将其返回给发件人。您可以通过如下示例来查看此操作的实际效果:
socat UDP-LISTEN:1011 - </dev/null # Succeeds as nothing sent
socat UDP-LISTEN:1011 - <<<'response' # Fails to send as sender not listening
socat UDP-LISTEN:2022 - </dev/null # Succeeds as nothing sent
socat UDP-LISTEN:2022 - <<<'response' # Fails to send as sender not listening
我想你可能想要其中一个UDP-RECVFROM
,它接收一个数据包并将其转发到标准输出在退出之前,或者UDP-RECV
,连续接受数据包并将它们中继到标准输出:
socat UDP-RECVFROM:1011 - # Receives one packet and exits
socat UDP-RECV:1011 - # Continuously relays packets to stdout
socat UDP-RECVFROM:2022 - # Receives one packet and exits
socat UDP-RECV:2022 - # Continuously relays packets to stdout
端口 2022 示例可以作为 root 或普通非特权用户运行。端口 1011 示例需要 root(或适当的能力)。