2013-05-28 3 views
2

Я пытаюсь работать с многоадресной рассылкой в ​​python, используя пример скрипта, который также доступен по адресу this location.Ошибка многоадресной рассылки Python IPv6 на MAC OSX

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:

$ netstat -gsv | grep ff0 
+0

fe80 :: это локально-локальный интерфейс, а не группа многоадресной рассылки. –

+0

@ Steve-o - Мне, наверное, нужен был сон, спасибо, что поймал это. –