链路作用域IPv6多播数据包突然无法在MacBook Pro上路由?

链路作用域IPv6多播数据包突然无法在MacBook Pro上路由?,c,sockets,ipv6,multicast,sendto,C,Sockets,Ipv6,Multicast,Sendto,这是一个有点模糊的问题,但我被难住了,我想可能有人在这个问题上有更多的线索 我的同事几个月来一直在他的MacBook Pro上成功运行一个使用IPv6多播的内部应用程序,但今天Mac决定停止路由多播数据包。特别是,程序会打印此错误: SendDataUDP(ff02::bead:cede:De契:feed@4)在网络接口上失败[Name=[en0]Description=[]IP=[fe80::222:41ff:fe21:dfd4@4]网络掩码=[ffff:ffff:ffff:ffff::]广播

这是一个有点模糊的问题,但我被难住了,我想可能有人在这个问题上有更多的线索

我的同事几个月来一直在他的MacBook Pro上成功运行一个使用IPv6多播的内部应用程序,但今天Mac决定停止路由多播数据包。特别是,程序会打印此错误:

SendDataUDP(ff02::bead:cede:De契:feed@4)在网络接口上失败[Name=[en0]Description=[]IP=[fe80::222:41ff:fe21:dfd4@4]网络掩码=[ffff:ffff:ffff:ffff::]广播=[::](错误号=65/没有到主机的路由)

。。。这很好地描述了哪里出了问题。。。它试图将UDP数据包发送到()所示的IP地址,但发送()失败,错误为errno=ehostureach

我不明白的是,什么可能会导致IPv6链路作用域多播地址“无法访问”?如果我对链路作用域多播的理解是正确的,则数据包只需从本地以太网端口(在本例中为en0,该端口在该机器上运行)


是我遗漏了多播的某些方面,还是他的机器坏了?他说他没有改变任何东西,只是神秘地停止了工作。

要测试en0是否仍然能够传输链路本地多播请求,请尝试

ping6 ff02::1%en0

这会联系所有主机,因此您应该会得到大量的响应(为了好玩,请尝试添加-w)。

查看以下内容可能会有所帮助。(特别是出口IPv6数据包出口路径ip6_output.c)当您在那里时,您还可以查看通向它的套接字调用,等等

对于多播,假设您正在将其设置为
ip6_output()
,则获得此错误的唯一可能方法似乎是不指定要发送的接口。(这很奇怪,因为错误消息明确提到了接口)


这台MacBook上的无线接口是否可能在以前没有启用的情况下启用,而现在“链接本地”多播的想法是不明确的?使用套接字时是否显式指定接口?地址末尾的@4在我看来很奇怪。(这是一个接口索引吗?)惯例通常是对接口作用域id使用
%
,但如前一个答案及其注释所述,它并没有得到普遍支持。

有趣的是,这不起作用,我不得不使用“-I”选项指定ping6的以太网地址。jdks mbp:~jeffk$ping6 ff02::1%en0 ping6:UDP connect:No route to host jdks mbp:~jeffk$ping6-I en0 ff02::1 ping6(56=40+8+8字节)fe80::21f:f3ff:fed8:3680%en0-->ff02::1来自fe80::21f:f3ff:fed8:3680%en0的16字节,icmp_seq=0 hlim=64 time=0.131 msHmm。你能发布一个最低限度的代码样本吗?我将在我的mac上测试它,看看是否可以在这里复制/调试它。我们终于在这里解决了问题。。。。至少在MacOS/X下,将接口索引放入sendto()调用的目标地址是不够的。操作系统可以而且有时确实选择使用自己的接口索引,忽略提供的接口索引并导致问题。解决方法是根据需要在套接字上调用setsockopt(fd、IPPROTO_IPV6、IPV6_MULTICAST_IF、&myIdx、sizeof(myIdx)),而不是(或另外)在sendto()地址参数中指定接口索引。我不确定这是一个bug还是一个“特性”。。。