2011-12-25 10 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)' –

+0

でも同じエラーが出る – wheybags

+1

有効な[マルチキャストアドレス](http://en.wikipedia。 org/wiki/Multicast_address#IPv4)、そのエラーが発生します。 244.1.1.1は有効ではありません。 – ext

答えて

1

使用しているマルチキャストアドレス244.1.1.1は無効です。マルチキャストアドレスの範囲は224.0.0.0〜239.255.255.255です。私はあなたのコードを有効なアドレス224.1.1.1で実行しましたが、うまくいきました。