2013-05-28 72 views
2

我正嘗試使用下面的示例腳本在python中使用多播,在 和this location之間也可以使用。MAC OSX上的Python IPv6多播錯誤

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() 

腳本但是當MAC OSX 10.8使用Python 2.7的預期方式運行,引發以下錯誤不起作用:

[Errno 49] Can't assign requested address 

任何人有任何想法的問題是什麼?我試圖在Ubuntu 13.04虛擬機上運行它,這樣看來,問題是MAC OSX

+0

不工作 – cobie

回答

1

嘗試改變下它工作得很好:

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

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

^您將需要使用netstat查找您的IPv6多播組地址(es):

$ netstat -gsv | grep ff0 
+0

fe80 ::是鏈路本地接口不是多播組。 –

+0

@史蒂夫 - 我肯定需要睡一覺,謝謝你的關注。 –