2016-11-07 13 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.setsockopt(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、 'あなたのipv6グループ')、0) –

+0

0 socket.INADDR_ANYの代わりに使うことができますか?私はnetのいくつかの例からコードのこの部分を得て、私はそれをかなり得ることはできませんが、私はINADDR_ANYを使用すると、私はすべてのポートでリッスンします。 –

0

これは私がmy codeでやっているものです:

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)) 

これは、DHCPv6サーバのためですが、あなたのアイデアを得るでしょう。 S = socket.socket(socket.AF_INET6、socket.SOCK_RAW、IP_PROTO_UDP) :

mc_sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_LOOP, 1) 
関連する問題