Python setsockopt与IP_ADD_MEMBERSHIP无效的参数

时间:2013-10-16 12:37:46

标签: python linux python-2.7 ubuntu-12.04

我正在尝试使用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'在哪里尝试了各种各样的东西,其中我在这里展示了一些东西。对于struct示例中的格式,我使用了有和没有网络字节顺序指示符('!')。原生的一个似乎翻了一番(从8到16)。我也尝试了有符号和无符号长('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'或任何其他接口,您可以检查MultiCast实际上是否已启用。此外,我认为224.3。*和224.250。*之间的任何地址都没有被分配用于其他用途。对我有用的'mreq'是

    mreq = struct.pack("!4sl", socket.inet_aton(self.group), socket.INADDR_ANY)

1 个答案:

答案 0 :(得分:1)

该线程较旧,但可能有助于了解IPV4组播地址使用保留的D类地址范围:224.0.0.0至239.255.255.255

如果IP地址超出此范围,setsockopt将抛出“无效参数”错误。

欢呼