IPv6中的RAW套接字UDP多播 [英] RAW socket UDP Multicast in IPv6

查看:366
本文介绍了IPv6中的RAW套接字UDP多播的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从UDP嗅探器的多播接收数据,但仅在IPv4中. 我的代码看起来像这样,

i receive data from multicast for my UDP sniffer, but only in IPv4. My code looks like this,

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多播地址接收数据. 对于任何想法,我将深表感激,对于我的英语,我深表歉意. ;-)

But i am receiving data only when i set IPv4 address, and i want also receive from IPv6 multicast address. I will be really grateful for any ideas and sorry for my english. ;-)

推荐答案

此示例在Windows中的FF02 :: 158(IoTivity UDP CoAP)上获得多播

this example gets a multicast on FF02::158 (IoTivity UDP CoAP) in Windows

import socket
import struct

address = ('', 5683)
interface_index = 0  # default

sock = socket.socket(family=socket.AF_INET6, type=socket.SOCK_DGRAM)
sock.bind(address)
for group in ['ff02::158']:  # multiple addresses can be specified
    sock.setsockopt(
        41,  # socket.IPPROTO_IPV6 = 41 - not found in windows 10, bug python
        socket.IPV6_JOIN_GROUP,
        struct.pack(
            '16si',
            socket.inet_pton(socket.AF_INET6, group),
            interface_index
        )
    )

while True:
    data, sender = sock.recvfrom(1500)
    while data[-1:] == '\0': data = data[:-1]  
    print(str(sender) + '  ' + repr(data))

这篇关于IPv6中的RAW套接字UDP多播的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆