我想要一台服务器发送广播 UDP 数据包,而同一台机器上的另外两台客户端接收这些数据包。我能以某种方式做到这一点吗?我应该使用哪个 IP 地址?
@gravyface 给了我希望,但我尝试了:
- 服务器发送到 127.255.255.255:54321,客户端监听 0.0.0.0:54321。
- 服务器发送到 127.255.255.255:54321,客户端监听 127.0.0.1:54321。
- 服务器发送到 127.255.255.255:54321,客户端监听 127.255.255.255:54321。
它们都没起作用!:(
OBS:我正在使用 REUSE_ADDR 和 SO_BROADCAST 选项。
答案1
第一个窗口:
socat -u udp-recv:12345,reuseaddr -
第二个窗口:
socat -u udp-recv:12345,reuseaddr -
第三个窗口
socat - udp-sendto:127.255.255.255:12345,broadcast
然后在第三个窗口中输入几行文本,看看在另外两个窗口中是否得到任何内容。
将“socat”替换为“strace -fe network socat”以查看实际正在进行的系统调用(假设您使用的是 Linux,其他 unices 有时也有等效项,称为 tusc、struss 或 dtruss)。socat 是开源的,大多数操作系统都可以使用二进制包。
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP) = 3
setsockopt(3, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
sendto(3, "qwe\n", 4, 0, {sa_family=AF_INET, sin_port=htons(12345), sin_addr=inet_addr("127.255.255.255")}, 16) = 4
上面,接收“客户端”绑定到 INADDR_ANY 地址。我发现,但不确定为什么,如果您绑定到环回子网上的地址,则看不到传入的数据包。
也可以看看:
$ ip route show table local dev lo scope link
broadcast 127.0.0.0 proto kernel src 127.0.0.1
broadcast 127.255.255.255 proto kernel src 127.0.0.1
如果客户端绑定到 127.0.0.0 或 127.255.255.255 并且服务器发送到同一地址(使用 SO_BROADCAST),那么它也能正常工作。
答案2
向 127.255.255.255 发送广播流量应该工作,但显然要测试一下(Wireshark/tcpdump 是你的好朋友)。
显然,您的客户端也需要在环回设备上进行监听。