1

我目前有以下接收多播数据的代码。

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', 24003))
mreq = struct.pack("=4sl", socket.inet_aton("238.210.10.1"), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

我有两个网卡,但代码只收听发送到 127.0.0.1 的消息。如何收听任何网卡上的所有多播消息?无需对它们进行硬编码。

4

2 回答 2

3

struct ip_mreq允许您选择一个接口来加入所需的多播组。指定INADDR_ANY允许系统通过在路由表中查找匹配路由上的接口来为您执行此操作(这意味着任何接口,而不是所有接口)。如果您在 Unix 上,您可以使用netstat -ng.

如果你想在所有接口上加入同一个组,然后枚举它们if_nameindex(3)(你必须弄清楚如何在 Python 中做到这一点),为每个接口创建一个套接字,并使用接口索引或地址bind(2)加入( )组setsockopt(2),然后使用 轮询套接字select

于 2013-01-07T19:39:37.227 回答
2
  1. UDP 套接字上没有“监听”。这是一个 TCP 术语。您需要通过所有适用的接口,通过循环加入多播组。这可确保将 IGMP JOIN 消息发送到所有需要的网络,因此他们会知道向您发送多播。

  2. 根据您的平台,您需要绑定到多播地址本身 (Linux) 或 INADDR_ANY = 0.0.0.0 (Windows)。我不确定 Unix 属于哪个阵营,但我怀疑在这种情况下它是 Windows 阵营。这确保您可以通过任何接口接收数据报。

于 2013-01-07T22:07:19.167 回答