2016-07-21 18 views
0

Gibt es eine Möglichkeit, socket.recvfrom(buf) zu verwenden, um alle IP- und UPD-Daten zu erhalten? insbesondere möchte ich den UDP-Header (Quellport, Zielport, Länge, Anwendungsdaten) sowie die IP-Spezifika wissen: Aus welcher IP kam sie, an welche Adresse wurde sie gesendet?Python - socket.recvfrom() erhalten ganze IP/UDP-Paket?

Snippet: (?)

addrinfo = socket.getaddrinfo(MULTICAST_ADDR, None)[0] 
sock = socket.socket(addrinfo[0], socket.SOCK_DGRAM) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind(('', DEST_PORT)) 

#Join Multicast grp. 
group = socket.inet_pton(addrinfo[0], addrinfo[4][0]) 
mreq = group + struct.pack('@I', 0) 
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) 

while True: 
    udp_data,ip_sender = sock.recvfrom(4000) 
    #Only returns udp data field and ip of sender 

Im auf Fenster, und mit socket.SOCK_RAW hängt Gibt es Workarounds?

+0

Ja, Sie haben Recht, brauchen Sie 'RAW_SOCKET'. – dsgdfg

+0

Der zweite von 'recvfrom' zurückgegebene Wert ist ein Tupel, das die IP-Adresse und den Port des Absenders enthält (z. B.' ('192.168.4.135', 37754) '). –

Antwort

0

sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
sock.bind(('', DEST_PORT)) 

sock.setsockopt(socket.IPPROTO_IPV6, socket.IP_HDRINCL, 1) 

verwenden, bevor Multicast grp Beitritt scheint zu funktionieren!