Skip to main content
 首页 » 编程设计

MAC OSX 上的 Python IPv6 多播错误

2025年05月04日9JustinYoung

我正在尝试使用下面的示例脚本在 python 中使用多播,该脚本也可在 this location .

MYPORT = 8123 
MYGROUP_4 = '225.0.0.250' 
MYGROUP_6 = 'ff15:7079:7468:6f6e:6465:6d6f:6d63:6173' 
MYTTL = 1 # Increase to reach other networks 
 
import time 
import struct 
import socket 
import sys 
 
def main(): 
    group = MYGROUP_6 if "-6" in sys.argv[1:] else MYGROUP_4 
 
    if "-s" in sys.argv[1:]: 
        sender(group) 
    else: 
        receiver(group) 
 
 
def sender(group): 
    addrinfo = socket.getaddrinfo(group, None)[0] 
 
    s = socket.socket(addrinfo[0], socket.SOCK_DGRAM) 
 
    # Set Time-to-live (optional) 
    ttl_bin = struct.pack('@i', MYTTL) 
    if addrinfo[0] == socket.AF_INET: # IPv4 
        s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl_bin) 
    else: 
        s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_HOPS, ttl_bin) 
 
    while True: 
        data = repr(time.time()) 
        s.sendto(data + '\0', (addrinfo[4][0], MYPORT)) 
        time.sleep(1) 
 
 
def receiver(group): 
    # Look up multicast group address in name server and find out IP version 
    addrinfo = socket.getaddrinfo(group, None)[0] 
 
    # Create a socket 
    s = socket.socket(addrinfo[0], socket.SOCK_DGRAM) 
 
    # Allow multiple copies of this program on one machine 
    # (not strictly needed) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
 
    # Bind it to the port 
    s.bind(('', MYPORT)) 
 
    group_bin = socket.inet_pton(addrinfo[0], addrinfo[4][0]) 
    # Join group 
    if addrinfo[0] == socket.AF_INET: # IPv4 
        mreq = group_bin + struct.pack('=I', socket.INADDR_ANY) 
        s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 
    else: 
        mreq = group_bin + struct.pack('@I', 0) 
        s.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, mreq) 
 
    # Loop, printing any data we receive 
    while True: 
        data, sender = s.recvfrom(1500) 
        while data[-1:] == '\0': data = data[:-1] # Strip trailing \0's 
        print (str(sender) + '  ' + repr(data)) 
 
 
if __name__ == '__main__': 
    main() 

然而,当按预期使用 python 2.7 在 MAC OSX 10.8 上运行时,该脚本无法运行,并抛出以下错误:

[Errno 49] Can't assign requested address 

有人知道问题出在哪里吗?我曾尝试在 Ubuntu 13.04 虚拟机上运行它,它工作得很好,所以问题似乎出在 MAC OSX 上

请您参考如下方法:

尝试更改以下内容:

MYGROUP_6 = 'ff15:7079:7468:6f6e:6465:6d6f:6d63:6173' 

到

MYGROUP6 = 'ff0n::nnn:nnnn:nnn:nnnn' 

^ 您将需要使用 netstat 来查找您的 IPv6 多播组地址:

$ netstat -gsv | grep ff0