簡體   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