【问题标题】:UDP multicast with multiple interfaces not working具有多个接口的 UDP 多播不起作用
【发布时间】:2016-04-08 00:53:04
【问题描述】:

我有 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(恰好是默认接口)上运行时,数据包才会被我的程序接收。

我正在使用以下代码根据我读到的here 的 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 &lt 0) { perror("IP_MULTICAST_IF"); } rv = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mc_addr, sizeof(mc_addr)); if(rv &lt 0) { perror("IP_ADD_MEMBERSHIP"); }

如果我使用enp5s0 一切正常,但使用ens6 时,即使我可以在我的交换机和wireshark 中看到活动,我也没有收到任何信息。更令人困惑的是,如果我启动我的程序两次,每个程序运行一个接口,每个程序都会收到数据包。

那么为什么我的程序在只使用ens6 时收不到数据包?

【问题讨论】:

  • 你将哪些参数传递给bind
  • @dbush 我一直在阅读其他一些帖子,并意识到我需要与INADDR_ANY 绑定,而我没有这样做。我改变了这个,但问题仍然存在。我似乎只能在两个接口都运行时接收。

标签: c linux udp multicast


【解决方案1】:

在多宿主主机中,您通常需要通过所有可用接口加入,除非您知道多播只会通过其中一个接口到达。否则 IGMP 加入消息不会发送到所有可能的路由器。

【讨论】:

  • 主机通过启用 IGMP Snooping + Querying 的单个交换机连接。我可以在 IGMP 表中看到两个接口/端口都加入了组。所以我认为 IGMP 不是问题。
猜你喜欢
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多