【问题标题】:Python UDP broadcast address anomaly on Windows 10Windows 10 上的 Python UDP 广播地址异常
【发布时间】: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”。 所以限制不是机器。

【问题讨论】:

    标签: python udp broadcast


    【解决方案1】:

    经过更多测试,我发现了问题所在。

    当您发送带有目标 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 可执行文件使用暴力破解方法。它在所有接口上广播。

    对我有帮助的帖子:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      相关资源
      最近更新 更多