在多个网络上侦听多播流量

时间:2013-01-07 18:15:18

标签: python sockets networking multicast

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

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的邮件。如何在任何网卡上收听所有组播消息?没有硬编码。

2 个答案:

答案 0 :(得分:2)

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

如果要在所有接口上加入相同的组,请使用if_nameindex(3)枚举它们(您必须弄清楚如何在Python中执行此操作),创建每个接口的套接字bind(2)并使用接口索引或地址加入(setsockopt(2))组,然后使用select轮询套接字。

答案 1 :(得分:2)

  1. UDP套接字上没有“侦听”。这是一个TCP术语。您需要通过所有适用的接口加入多播组通过循环它们。这确保了IGMP JOIN消息被发送到所有必需的网络,因此他们知道向您发送多播。

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