首页 文章

在Python中发送和接收IPv6链路本地多播UDP数据报?

提问于
浏览
5

以下是简单的IPv4 UDP广播,然后监听所有接口 .

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
sock.bind(("", 1337))
sock.sendto("hello world", ("255.255.255.255", 1337))
while True:
    data, addr = sock.recvfrom(0x100)
    print "received from {0}: {1!r}".format(addr, data)

我想调整它来发送和接收IPv4和IPv6 .

我尽可能多地阅读并尽可能多地阅读并相信以下内容大致是我需要采取的路线:

  • 创建IPv6套接字 .

  • 将套接字添加到链接或站点本地多播组 .

  • 将UDP数据包发送到正在使用的组的多播地址 .

进一步的信息我可能需要绑定到几个接口,并使用 setsockopt() 告诉套接字它还应该接收多播数据包 . 最后, getaddrinfo() 可以全面使用,优雅"drop back"到IPv4,其中IPv6不可用 .

我已经实现了很多,但主要是在多播部分上发现了 . Python中的完整代码示例,或者对所需常量和地址的生动描述是首选 .

2 回答

  • 1

    这是一个链接到python mcast demo,同时是IPv4和IPv6 .

  • 0

    我正在问一个关于here的问题,涉及获取收到消息的多播地址,但源代码回答了你的问题!

    听:

    # Initialise socket for IPv6 datagrams
    sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
    
    # Allows address to be reused
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    
    # Binds to all interfaces on the given port
    sock.bind(('', 8080))
    
    # Allow messages from this socket to loop back for development
    sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_LOOP, True)
    
    # Construct message for joining multicast group
    mreq = struct.pack("16s15s".encode('utf-8'), socket.inet_pton(socket.AF_INET6, "ff02::abcd:1"), (chr(0) * 16).encode('utf-8'))
    sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq)
    
    data, addr = sock.recvfrom(1024)
    

    并发送:

    # Create ipv6 datagram socket
    sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
    # Allow own messages to be sent back (for local testing)
    sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_LOOP, True)
    sock.sendto("hello world".encode('utf-8'), ("ff02::abcd:1", 8080))
    

    这是python3.6,使用python 2.7我不认为编码是必要的 . 同样在struct.pack中,我看过“16s15s”的变体,比如“4s”,但我不知道它是什么以及我为我工作了什么!

相关问题