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

chr*_*tek 5 networking multicast tcp udp

我想让一台服务器在同一台机器上发送广播 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 选项。

sch*_*sch 10

第一个窗口:

socat -u udp-recv:12345,reuseaddr -
Run Code Online (Sandbox Code Playgroud)

第二个窗口:

socat -u udp-recv:12345,reuseaddr -
Run Code Online (Sandbox Code Playgroud)

第三个窗口

socat - udp-sendto:127.255.255.255:12345,broadcast
Run Code Online (Sandbox Code Playgroud)

然后在第三个窗口中输入几行文本,看看其他两个窗口中是否有任何内容。

将“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
Run Code Online (Sandbox Code Playgroud)

上面,接收“客户端”绑定到 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
Run Code Online (Sandbox Code Playgroud)

如果客户端绑定到 127.0.0.0 或 127.255.255.255 并且服务器发送到相同的地址(使用 SO_BROADCAST),那么它也能正常工作。


gra*_*ace 1

将广播流量发送到 127.255.255.255应该可以,但显然要对其进行测试(Wireshark/tcpdump 是你的朋友)。

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