【发布时间】: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 < 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 时收不到数据包?
【问题讨论】:
-
你将哪些参数传递给
bind? -
@dbush 我一直在阅读其他一些帖子,并意识到我需要与
INADDR_ANY绑定,而我没有这样做。我改变了这个,但问题仍然存在。我似乎只能在两个接口都运行时接收。