2011-12-25 46 views
3

我有一些示例python代碼,我從另一個堆棧溢出的答案(不記得在哪裏),實現多播。以下代碼應該設置一個用於接收多播數據包的套接字對象。 我封裝它在一個類中,像這樣:python奇怪的多播套接字異常

class Multisock:

def __init__(self, MCAST_GRP, MCAST_PORT, packsize): 
    import socket 
    import struct 

    self.MCAST_GRP = MCAST_GRP 
    self.MCAST_PORT = MCAST_PORT 

    self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    self.sock.bind(('', MCAST_PORT)) 
    mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY) 

    self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 

然而,這給了我這個錯誤:

Traceback (most recent call last): 
    File "./Audiorecv.py", line 41, in <module> 
    sock = MulticastNetworking.Multisock('244.1.1.1', 5007, chunk) 
    File "/home/wheybags/Multicast-Voice-Chat/MulticastNetworking.py", line 30, in __init__ 
    self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 
    File "/usr/lib/python2.7/socket.py", line 224, in meth 
    return getattr(self._sock,name)(*args) 
socket.error: [Errno 22] Invalid argument 

這實在是令人困惑,因爲如果我只是設置MCAST_GRP靜態爲字符串代表一個IP,它的工作原理,但它會給出上面的錯誤,如果我嘗試使用構造函數參數。

+0

如果你使用這個,會發生什麼? 'mreq = struct.pack(「= 4sl」,socket.inet_aton(MCAST_GRP),socket.INADDR_ANY)' – 2011-12-25 19:02:42

+0

仍然給出相同的錯誤 – wheybags 2011-12-30 16:23:01

+1

確保你提供了一個有效的[多播地址](http://en.wikipedia。 org/wiki/Multicast_address#IPv4),否則你會得到這個錯誤。 244.1.1.1無效,可能的錯字。 – ext 2012-01-14 03:49:53

回答

1

您使用的多播地址244.1.1.1無效。組播地址範圍從224.0.0.0到239.255.255.255。我用224.1.1.1來運行你的代碼,這是一個有效的地址,它工作得很好。