2

我正在尝试使用 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”,我尝试了各种东西,我在这里展示了一些。对于结构示例中的格式,我在有和没有网络字节顺序指示符('!')的情况下都使用了。原生的似乎增加了一倍(从 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)
4

1 回答 1

2

该线程很旧,但知道 IPV4 多播地址使用保留的 D 类地址范围可能会有所帮助:224.0.0.0 到 239.255.255.255

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

干杯

于 2020-11-11T18:20:42.583 回答