在Unix中的同一端口python上接收不同的多播组子集?

问题描述

我有几个分布在多个多播组中的数据流,它们都具有相同的目标端口。 例如,我们称它们为组播组1-4和组播地址239.192.0.1-4,它们都发送到端口1000。

然后我在同一台计算机上有多个应用程序想要订阅数据的不同子集。

  • 应用程序A希望所有1-4个组
  • 应用程序B只需要第2组
  • 应用程序C需要3-4个组。

订户应用程序套接字设置代码示例:

sock = socket.socket(family=socket.AF_INET,type=socket.soCK_DGRAM)
sock.setsockopt(socket.soL_SOCKET,socket.so_REUSEADDR,1)
sock.bind(("",1000))

# Each application specifies a different multicast_groups list
# application A wants 1-4
# multicast_groups = ["239.192.0.1","239.192.0.2","239.192.0.3","239.192.0.4"]
# application B wants 2
# multicast_groups = ["239.192.0.2"]
# application A wants 3-4
# multicast_groups = ["239.192.0.3","239.192.0.4"]

# Subscribe to any multicast groups
for group_address in multicast_groups:
    group = socket.inet_aton(group_address)
    mreq = struct.pack('4sL',group,socket.INADDR_ANY)
    sock.setsockopt(socket.IPPROTO_IP,socket.IP_ADD_MEMBERSHIP,mreq)

在Windows上,这按预期工作。每个应用程序仅获得其订阅的多播组,而忽略所有其他组。

但是,在Unix上,每个应用程序都获得它和其他应用程序预订的所有多播组的并集。 (即,仅运行应用程序B时,它仅按预期接收组2,但是当我启动应用程序C时,两个应用程序现在都接收组2-4)。

我怀疑这与Unix如何处理端口重用(与Windows有所不同)有关,但是对Unix的了解不足以追踪我在做什么错。

我发现的其他解决方案建议绑定到多播组而不是包罗万象的“”,这适用于希望接收多个组播组的应用程序B但不适用于希望接收多个组播组的应用程序C。

我遗漏了什么明显的东西,为什么我的代码可以在Windows上运行而不能在Unix上运行?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)