簡體   English   中英

多個接口無法正常工作的UDP組播

[英]UDP multicast with multiple interfaces not working

我有2個網絡接口


 enp5s0   Link encap:Ethernet  HWaddr d8:cb:8a:c3:4d:61  
          inet addr:192.168.1.3  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::dacb:8aff:fec3:4d61/64 Scope:Link
          inet6 addr: 2607:fa48:6d42:4230::1003/128 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

ens6      Link encap:Ethernet  HWaddr a0:36:9f:57:0b:ac  
          inet addr:192.168.1.5  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a236:9fff:fe57:bac/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

偵聽來自224.1.1.1:5007 UDP多播數據包,但只有我的程序在enp5s0上運行才會收到數據包,這恰好是默認接口。

我正在使用以下代碼根據我在此處閱讀的內容選擇基於IP的接口。 但它似乎沒有用。


struct ip_mreq mc_addr = {};                                                
mc_addr.imr_multiaddr.s_addr = inet_addr("224.1.1.1");                      
mc_addr.imr_interface.s_addr = inet_addr(argv[1]);                          
int rv = setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF,  &mc_addr.imr_interface, sizeof(mc_addr.imr_interface)); 
if(rv < 0) {
    perror("IP_MULTICAST_IF");                                              
}                                                                           
rv = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP,  &mc_addr, sizeof(mc_addr)); 
if(rv < 0) {                                                                
    perror("IP_ADD_MEMBERSHIP");                                            
} 

如果我使用enp5s0一切正常,但在使用ens6時,即使我可以在我的交換機和wireshark上看到活動,我也什么也ens6 更令人困惑的是,如果我開始我的程序兩次,每個程序運行一個接口,每個程序都接收數據包。

那么為什么我的程序在僅使用ens6時不接收數據包?

在多宿主主機中,您通常需要通過所有可用接口加入,除非您知道多播只能通過其中一個到達。 否則,IGMP加入消息不會轉到所有可能的路由器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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