有一台服务器将向组播组发送消息.

我有多个客户端将从该多播组接收消息.

我的理解是,任何人如果在套接字上订阅,都可以向多播组发送消息.这意味着订阅会让我接触到很多我并不关心的流量.

在我的客户机代码中,我可以设置一个条件来判断消息是否来self 想要收听的发件人:

data, address = sock.recvfrom(1024)
if address not in trusted:
    continue

然而,我想知道是否有一种方法可以将套接字配置为只看到可信主机的流量.

更进一步,我想知道在从python客户端代码订阅多播组时,是否有一种方法可以按源地址过滤.

如果不是,我是否只需要将路由配置为按源IP过滤组播流量?

这里有哪些选项可用?

推荐答案

您可以使用source specific multicast进行过滤,这允许套接字仅从某些发送方接收组播流量.

通常,您会使用IP_ADD_MEMBERSHIP套接字选项加入这样的组播组:

MCAST_GRP = '224.1.1.1'
LOCAL_INT_IP = '192.168.1.2'   # local address of joining interface

mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP),
                          socket.inet_aton(LOCAL_INT_IP))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

相反,请使用IP_ADD_SOURCE_MEMBERSHIP选项,该选项允许您指定发件人IP:

MCAST_GRP = '232.1.1.1'
LOCAL_INT_IP = '192.168.1.2'   # local address of joining interface
SENDER_IP = '192.168.1.10'

mreq_src = struct.pack("4sl", socket.inet_aton(MCAST_GRP),
             socket.inet_aton(LOCAL_INT_IP), socket.inet_aton(SENDER_IP))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_SOURCE_MEMBERSHIP, mreq_src)

关于源特定组播,需要注意的一点是组播地址必须在232.0.0.0/8范围内.

Python相关问答推荐

三个给定的坐标可以是矩形的点吗

Pydantic 2.7.0模型接受字符串日期时间或无

Pandas 在最近的日期合并,考虑到破产

比较两个数据帧并并排附加结果(获取性能警告)

SQLAlchemy Like ALL ORM analog

Asyncio:如何从子进程中读取stdout?

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

删除marplotlib条形图上的底边

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

用渐近模计算含符号的矩阵乘法

在极中解析带有数字和SI前缀的字符串

将链中的矩阵乘法应用于多组值

mdates定位器在图表中显示不存在的时间间隔

Autocad使用pyautocad/comtypes将对象从一个图形复制到另一个图形

高效生成累积式三角矩阵

pytest、xdist和共享生成的文件依赖项

我如何处理超类和子类的情况

如何从一个维基页面中抓取和存储多个表格?

Groupby并在组内比较单独行上的两个时间戳

使用元组扩展字典的产品挑战