모두를 수신하고 싶습니다. 가능하다면 레이어 2에서 작동하지 않고 특정 인터페이스에 도착한 멀티 캐스트 IPv6 패킷이 도착합니다.리눅스에서 모든 멀티 캐스트 ICMPv6 패킷을 수신합니다.
원시 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 멀티 캐스트 프로그래밍에 관한 문서는 거의 없습니다.
예, 이것은 내가 지정한 멀티 캐스트 주소의 일부입니다. – dietr
죄송합니다, 당신이하는 말을 이해하지 못합니다. 범위 ID는 여기에 관련이 없습니다. * 수신 * 패킷이 아닌 * 전송 * 패킷의 중요성. 여기서 중요한 것은 인터페이스 일 뿐이며 올바르게 설정됩니다. – dietr
UDP ?! ICMPv6 패킷을 받고 싶습니다. 그것은 전혀 UDP가 아닙니다! ICMPv6를 사용하려면 원시 소켓을 사용해야합니다. IPv6 멀티 캐스트가 원시 소켓에서 작동하지 않는 이유는 무엇입니까? 이 문서는 어디에 문서화되어 있습니까? 내 정보원은 DGRAM과 RAW 소켓에서만 작동한다고합니다. BTW : 위의 컨텍스트 밖의 주석에 대해 궁금한 점이 있다면, 저는 이제 자신의 의견을 삭제하기로 결정한 사람에게 대답했습니다. 한숨. – dietr