代码之家  ›  专栏  ›  技术社区  ›  Matt Joiner

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

  •  5
  • Matt Joiner  · 技术社区  · 14 年前

    下面是一个简单的ipv4udp广播,然后监听所有接口。

    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。

    我已经翻遍了所有的书,尽可能多地阅读,相信下面是我需要走的大致路线:

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

    setsockopt() getaddrinfo() 可全面用于优雅地“回退”到IPv6不可用的IPv4。

    我已经实现了很多,但主要是在多播部分。最好用Python编写完整的代码示例,或者生动地描述所需的常量和地址。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Nikolai Fetissov    14 年前

    这里有一个链接 python mcast demo ,同时执行IPv4和IPv6。

        2
  •  0
  •   Jordan Mackie    6 年前

    我正在问一个问题 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的,对于python2.7,我认为没有必要进行编码。同样在struct.pack系列中,我也看到了“16s15s”的变体,比如“4s”,但我不知道它是什么,也不知道我为自己做了什么!