簡體   English   中英

向具有多播地址的多個接口發送 UDP 數據報

[英]Send UDP datagrams to multiple interfaces with multicast address

我有一台 Windows 11 機器,它有兩個網絡接口:

  1. 192.168.1.16/24 :物理 Ethe.net 連接到外部路由器)
  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM