我可以在单台机器上测试广播数据包吗?

我可以在单台机器上测试广播数据包吗?

我想要一台服务器发送广播 UDP 数据包,而同一台机器上的另外两台客户端接收这些数据包。我能以某种方式做到这一点吗?我应该使用哪个 IP 地址?


@gravyface 给了我希望,但我尝试了:

  1. 服务器发送到 127.255.255.255:54321,客户端监听 0.0.0.0:54321。
  2. 服务器发送到 127.255.255.255:54321,客户端监听 127.0.0.1:54321。
  3. 服务器发送到 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 是你的好朋友)。

显然,您的客户端也需要在环回设备上进行监听。

相关内容