Python 2.7.3 を使用して、Ubuntu でマルチキャスト UDP パッケージを受信できるソケットを作成しようとしています。コードはhttps://stackoverflow.com/a/1794373/1444854に基づいています
残念ながら、同じエラーが発生し続けます:
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
これは私が使用したコードです
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind(("", 12345))
self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
「mreq」については、さまざまなことを試しましたが、そのうちのいくつかをここに示します。構造体の例の形式については、ネットワーク バイト オーダー インジケーター ('!') を使用した場合と使用しない場合の両方を使用しました。ネイティブのものはサイズが 2 倍になるようです (8 から 16)。また、符号付きと符号なしの両方の long (「l」と「L」) も試しました。
group = "127.0.0.1" # Or any other ipv4 address...
mreq = socket.inet_aton(group) + socket.inet_aton("0.0.0.0")
mreq = struct.pack("4sL", socket.inet_aton(self.group), socket.inet_aton("0.0.0.0"))
mreq = struct.pack("4sL", socket.inet_aton(self.group), socket.htonl(socket.INADDR_ANY))
mreq = struct.pack("4sL", socket.inet_aton(self.group), socket.INADDR_ANY)
この時点で、何が問題なのかわかりません。間違った 'mreq' が問題を引き起こすだろうと思っていましたが、何度も試してみると、何か他に欠けているものがあるに違いないと感じました。
どんな助けでも大歓迎です。さらに情報が必要な場合は、喜んで提供します。
編集:
私が完全に見落としていた問題は、適切なマルチキャスト インターフェイスが必要だったという事実でした。「ifconfig wlan0」またはその他のインターフェイスを使用して、マルチキャストが実際に有効になっていることを確認できます。さらに、224.3.* から 224.250.* までのアドレスは、他の用途に割り当てられていないと思います。私のために働く「mreq」は
mreq = struct.pack("!4sl", socket.inet_aton(self.group), socket.INADDR_ANY)