首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux上接收所有多播ICMPv6数据包

在Linux上接收所有多播ICMPv6数据包
EN

Stack Overflow用户
提问于 2012-09-27 19:46:09
回答 2查看 1.4K关注 0票数 1

如果可能的话,我想接收到达某个接口的所有多播IPv6数据包,而不需要在第二层上操作。

我为原始的ICMPv6数据包打开一个套接字,并接收专用于我的机器的单播数据包。然而,许多ICMPv6包都是链路本地组播(例如邻居请求)。什么是正确的方式来侦听所有的多播流量,包括请求的节点多播?目前,我尝试使用IPV6_ADD_MEMBERSHIP添加多播组,但这似乎不起作用。这是我的密码:

代码语言:javascript
复制
/* open RAW socket to receive on */
if ((sockfd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) {
    perror("socket");
}

/* get device index */
memset(&if_idx, 0, sizeof(struct ifreq));
strncpy(if_idx.ifr_name, DEVNAME, IFNAMSIZ-1);
if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) {
    perror("SIOCGIFINDEX");
}

/* configure to receive all multicast packets on this interface */
memset(&mreq, 0, sizeof(struct ipv6_mreq));
inet_pton(AF_INET6, "ff02::", &mreq.ipv6mr_multiaddr);
mreq.ipv6mr_interface = if_idx.ifr_ifindex;
if (setsockopt(sockfd, SOL_SOCKET, IPV6_ADD_MEMBERSHIP, &mreq,
            sizeof(struct ipv6_mreq)) < 0) {
    perror("setsockopt");
}

我做错了什么?我想要的一定是可能的。我尝试了ff02::和ff02::1:ff00:0作为组,后者甚至使setsockopt失败。到底怎么回事?不幸的是,关于IPv6多播编程的文档很少。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-29 02:36:38

毕竟这似乎是不可能的。我现在使用Linux的AF_PACKET套接字类型和“熟透”模式(SOCKET_DGRAM)来访问带有链路层报头的原始IPv6数据包,使用BPF过滤ICMPv6 ND数据包--至少我不需要这样处理解析以太网头的问题,而且我可能更容易地支持其他链路层类型。

票数 0
EN

Stack Overflow用户

发布于 2012-09-28 15:39:44

使用SOL_IPV6而不是SOL_SOCKET

测试订阅ff80::1并使用ping6 -I eth0 ff08::1生成流量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12628953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档