[英]Send UDP datagrams to multiple interfaces with multicast address
我有一台 Windows 11 機器,它有兩個網絡接口:
192.168.1.16/24
:物理 Ethe.net 連接到外部路由器)172.22.112.1/20
(vEthe.net(默認交換機):來自 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 將數據包轉發到所有接口?
最初我認為多播會將 go 發送到所有加入的接口,Windows 是否正確處理了這個問題?
數據包只會從一個接口發出 go,無論它們是單播、多播還是廣播。
處理此問題的正確方法正如您所發現的那樣,即在發送數據包之前在套接字上設置IP_MULTICAST_IF
選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.