2016-11-07 6 views
1

UDP 스니퍼는 멀티 캐스트에서 데이터를 수신하지만 IPv4에서만 데이터를 수신합니다. 내 코드가RAW 소켓 IPv6의 UDP 멀티 캐스트

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_UDP) 
except socket.error as msg: 
    print('Socket could not be created. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]) 
    sys.exit() 

mreq = struct.pack("4sl", socket.inet_aton('239.255.11.3'), socket.INADDR_ANY) 
# receive a packet 

s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 

packet = s.recvfrom(65000) 

, 다음과 같습니다하지만 난 IPv4 주소를 설정 한 경우에만 데이터를 수신하고, 나는 또한 원하는 IPv6 멀티 캐스트 주소에서받을 수 있습니다. 나는 어떤 아이디어라도 정말로 감사 할 것이고, 나의 영어를 위해 유감스럽게 생각할 것이다. ;-)

+0

내 생각이 있었다 : 당신은 또한 자신에 의해 전송 멀티 캐스트 패킷을 얻고 싶은 경우에

당신은 추가해야 및 s.sockockopt (socket.IPPROTO_IP, socket.IPV6_JOIN_GROUP, mreq) 하지만 난 몰라 어떻게 "포장"mreq 또는 그것을 설정합니다. –

답변

0

IPv6와 IPv4 사이의 API가 약간 다르므로 sockopt IPV6_ADD_MEMBERSHIP을 사용해야합니다. This이 좋은 예입니다.

+0

좋아, 고마워. 그리고 위의 코드에서 "mreq"를 설정하는 방법을 알고 있습니까? (mreq = struct.pack ("4sl", socket.inet_aton ('239.255.11.3'), socket.INADDR_ANY)) 나는 그것을 포장하는 방법을 모른다. –

+0

ipv6_mreq는 16 바이트 주소 및 부호없는 int 인터페이스 색인입니다. mreq6 = struct.pack ("16sI", socket.inet_pton (AF_INET6, '귀하의 ip v6 그룹'), 0) –

+0

그리고 0 대신 socket.INADDR_ANY를 사용할 수 있습니까? net의 일부 예제에서이 코드 부분을 얻었지만 제대로 가져 오지 못했지만 INADDR_ANY를 사용할 때 모든 포트에서 수신 대기한다고 가정합니다. –

0

이 내가 my code에서 뭘하는지입니다 : 이것은 DHCPv6 서버입니다

mc_address = ipaddress.IPv6Address('ff02::1:2') 
listen_port = 547 
interface_index = socket.if_nametoindex('eth0') 

mc_sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
mc_sock.bind((str(mc_address), listen_port, 0, interface_index)) 
mc_sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, 
        struct.pack('16sI', mc_address.packed, interface_index)) 

을,하지만 당신은 아이디어를 얻을 수 있습니다. S = socket.socket (socket.AF_INET6, socket.SOCK_RAW, IP_PROTO_UDP) :

mc_sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_LOOP, 1)