可能であれば、レイヤ2で動作することなく、特定のインターフェイスに到着するすべてのマルチキャストIPv6パケットを受信したいと思います。
生の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マルチキャストプログラミングに関するドキュメントはほとんどありません。