【发布时间】:2021-04-12 17:10:50
【问题描述】:
我正在尝试发送 UDP 广播消息,但我使用的地址有问题。 如果我跑:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.sendto("hello broadcast".encode("ascii"), ("<broadcast>", 1500))
s.sendto("hello 11".encode("ascii"), ("192.168.1.11", 1500))
s.sendto("hello 255".encode("ascii"), ("192.168.1.255", 1500))
s.sendto("hello 255.255".encode("ascii"), ("192.168.255.255", 1500))
s.sendto("hello 255.255.255".encode("ascii"), ("192.255.255.255", 1500))
s.sendto("hello 255.255.255.255".encode("ascii"), ("255.255.255.255", 1500))
并使用 Wireshark 记录流量,我只看到以下数据包:
192.168.1.11
192.168.1.255
192.168.255.255
192.255.255.255
但不适用于:
<broadcast>
255.255.255.255
当我使用 Python 3.6.9 从 WSL1(Linux 的 Windows 子系统)运行它时,以及使用 Python 3.7.2 从 Windows 10 Powershell 运行它时,都会发生这种情况。
如果我使用 WSL2,使用 python 3.8.2,我会得到以下数据包:
192.168.1.11
192.168.255.255
192.255.255.255
但不适用于:
<broadcast>
192.168.1.255
255.255.255.255
这真的很奇怪。 “真实”广播地址被忽略。
似乎在 Windows 10 中设置 socket.SO_BROADCAST 被忽略了。
如果我注释掉 s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1),我会在尝试通过广播地址发送内容时出错。
如果我使用 Linux 机器(Python 版本 2.7.17、2.7.18、3.6.9 和 3.8.5),我会收到以下数据包:
<broadcast>
192.168.1.255
255.255.255.255
但不适用于:
192.168.1.11
192.168.255.255
192.255.255.255
这是我对广播的期望。为什么它在 Windows 10 和 WSL 上不能以这种方式工作,我该如何解决?
我有一个发送 UDP 广播消息的 Windows 可执行文件,我可以看到它发送到“255.255.255.255”。 所以限制不是机器。
【问题讨论】: