2016-11-07 22 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 = socket.socket(socket.AF_INET6,socket.SOCK_RAW,IP_PROTO_UDP) 和s.setsockopt(socket.IPPROTO_IP,socket.IPV6_JOIN_GROUP,mreq) 但我不知道,如何「打包」mreq或設置它。 –

回答

0

您需要使用sockopt IPV6_ADD_MEMBERSHIP,因爲IPv6與IPv4之間的API略有不同。 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?我從網絡的一些例子中得到了這部分代碼,但我並不完全明白,但是我想當我使用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服務器,但你會得到的想法。

如果你也想自己發送的組播包你必須添加:

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