我有一臺具有兩個網路介面的 Windows 11 機器:
192.168.1.16/24(Wi-Fi:物理以太網連接到外部路由器)172.22.112.1/20(vEthernet(默認交換機):Hyper-V 的內部虛擬交換機)
我正在撰寫一個應該通過兩個介面發送多播訊息的應用程式。
理想情況下,我只想從應用程式發送一次資料,并且資料最終會出現在兩個介面上,而無需配置 Windows :):
s = socket(AF_INET, SOCK_DGRAM, ...)
bind(s, INADDR_ANY,...)
sendto(s, buf, ..., 239.255.0.1, ...)
不幸的是,訊息僅在 Wi-Fi 界面上到達。我猜這個介面是由路由表決定的。
PS>netstat -rn
Active Routes:
Network Destination Netmask Gateway Interface Metric
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.16 50
...
224.0.0.0 240.0.0.0 On-link 172.22.112.1 5256
224.0.0.0 240.0.0.0 On-link 192.168.1.16 306
...
在這種情況下,它只轉到介面 192.168.1.16,因為度量是匹配路由的最小值。如果兩個介面都加入了多播組,也會發生這種情況。
PS> netsh int ip show joins
Interface 1: Wi-Fi
Scope References Last Address
---------- ---------- ---- ---------------------------------
...
0 1 Yes 239.255.0.1
0 3 Yes 239.255.255.250
...
Interface 2: vEthernet (Default Switch)
Scope References Last Address
---------- ---------- ---- ---------------------------------
...
0 1 Yes 239.255.0.1
0 4 Yes 239.255.255.250
我找到的一種解決方案是像這樣發送資料包兩次:
setsockopt (socket, IPPROTO_IP, IP_MULTICAST_IF, 192.168.1.16, ...)
sendto(s, buf, ..., 239.255.0.1, ...)
setsockopt (socket, IPPROTO_IP, IP_MULTICAST_IF, 172.22.112.1, ...)
sendto(s, buf, ..., 239.255.0.1, ...)
有沒有辦法在沒有setsockopt IP_MULTICAST_IF回圈的情況下通過所有介面實作組播訊息的發送?也許我錯過了一些套接字選項?
或者如果在代碼中不可能,有沒有辦法配置 Windows 將資料包轉發到所有介面?
最初我認為多播會轉到所有加入介面,Windows 是否正確處理了這個?
uj5u.com熱心網友回復:
資料包只會從一個介面發出,無論它們是單播、多播還是廣播。
正如您所發現的,處理此問題的正確方法是IP_MULTICAST_IF在發送資料包之前在套接字上設定選項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/456549.html
