【问题标题】:Duplicate packets in Python multicast receiverPython多播接收器中的重复数据包
【发布时间】:2011-06-17 14:43:28
【问题描述】:

有一个脚本可以打开一个套接字并从中读取多播(来自Multicast in Python

import socket
import struct

MCAST_GRP = '224.1.1.1'
MCAST_PORT = 1234

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

sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while True:
  print sock.recv(10240)

只要我不将同一个脚本并行运行到另一个多播组,一切都很好,但是端口是相同的,例如

rtp://224.1.1.1:1234
rtp://224.1.1.2:1234

启动第二个脚本后开始混乱 - 第一个脚本看到第二个和第二个到第一个的数据包。

我尝试以mcast.py 的身份进行操作——结果相似。

为什么会发生这种情况以及如何治疗?

UPD 修复

-sock.bind(('', MCAST_PORT))
+sock.bind((MCAST_GRP, MCAST_PORT))

【问题讨论】:

  • 嗯,显然曾经有一个问题,socket 模块不是线程安全的 (bugs.python.org/issue1544279),但似乎从 Python 2.5 左右开始就已经解决了。跨度>
  • 今天我尝试在python3上运行这个脚本 - 结果是一样的。
  • 等等...绑定一个socket到一个空主机然后再分配主机有什么影响?
  • 我认为这是多播的一个功能。在许多示例中都可以找到此代码。但是今天我尝试将一个套接字绑定到一个多播组,看起来它可以工作,问题就消失了。
  • 嘿,我有种感觉。

标签: python multicast python-2.6


【解决方案1】:

侦听端口上所有传入连接的应用程序会将所有消息发送到该端口,无论哪个应用程序启动了多播组成员身份。为了缓解这种情况,通过将其指定为bind 的地址元组中的第一个参数,让每个应用程序都侦听它期望从中获取数据的多播地址。

【讨论】:

  • 是的,看来 azhurb 今天想通了。
  • @JAB 我知道,这就是为什么这个答案被标记为社区维基。它有助于保持结构化的问答格式,如果可以写得更好,编辑社区 wiki 答案比附加其他评论要好得多。
猜你喜欢
  • 2011-06-24
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2022-11-02
  • 2018-08-19
  • 1970-01-01
相关资源
最近更新 更多