Python多播接收器中的重复数据包

时间:2011-06-17 14:43:29

标签: python multicast python-2.6

有一个脚本可以打开一个套接字并从中读取多播(来自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))

1 个答案:

答案 0 :(得分:3)

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