[英]Python UDP broadcast address anomaly on Windows 10
我正在尝试发送 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
This happens when I run it from WSL1 (Windows Subsystem for Linux), using Python 3.6.9, and also when I run it from Windows 10 Powershell, using Python 3.7.2.
如果我使用 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 上不起作用,我该如何解决?
我有一个 Windows 可执行文件,它发送 UDP 广播消息,我可以看到它发送到“255.255.255.255”。 所以限制不是机器。
经过更多的测试,我发现了问题所在。
当您发送带有目标 IP 地址的消息时,系统知道要使用哪个接口。 因为广播不需要 IP 地址,系统不知道使用哪个接口。 系统会根据某种机制选择一个接口来发送广播消息。
我所有的 Linux 盒子只有一个接口(例如eth0
或eno1
),所以没有太多选择。 您可以通过运行hostname -I
找到与这些接口关联的 IP 地址。 在这种情况下,在接口eno1
上给了我192.168.1.51
并且所有广播消息都来自该接口。 查看路由运行route
或ip route
。
然而,我的 Windows 10 盒子有几个接口eth0
、 eth1
和eth2
。 我的以太网电缆连接到eth0
。 当我运行hostname -I
时,我在各自的接口eth0 eth1 eth2
上得到192.168.1.100 192.168.56.1 172.30.48.1
。 由于某种原因,所有广播消息都来自eth1
。
当我将s.bind(('192.168.1.100', 0))
添加到我的代码中时,广播消息来自接口eth0
,这是连接以太网电缆的位置。
发送 UDP 广播消息的 Windows 可执行文件使用蛮力方法。 它在所有接口上广播。
对我有帮助的帖子:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.