gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:13 27 4
gpt4 key购买 nike

如果可能的话,我希望接收到达特定接口(interface)的所有多播 IPv6 数据包,而不求助于第 2 层操作。

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

/* 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 多播编程的文档非常少。

最佳答案

使用 SOL_IPV6 而不是 SOL_SOCKET

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

关于linux - 在 Linux 上接收所有多播 ICMPv6 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12628953/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com