繁体   English   中英

Python UDP 广播地址异常 Windows 10

[英]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 盒子只有一个接口(例如eth0eno1 ),所以没有太多选择。 您可以通过运行hostname -I找到与这些接口关联的 IP 地址。 在这种情况下,在接口eno1上给了我192.168.1.51并且所有广播消息都来自该接口。 查看路由运行routeip route

然而,我的 Windows 10 盒子有几个接口eth0eth1eth2 我的以太网电缆连接到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM