2011-06-17 41 views
2

有打开一个套接字,并从中读取组播的脚本(从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)) 
+0

好吧,显然以前有一个问题,'socket'模块不是线程安全的(http://bugs.python.org/issue1544279),但从Python 2.5版本开始已经修复了, 。 – JAB

+0

今天我试图在python3上运行这个脚本 - 结果是一样的。 – azhurb

+0

Wait ...将套接字绑定到空主机然后再分配主机有什么作用? – JAB

回答

2

的应用程序监听端口上的所有传入连接将得到所有的信息到该端口,无论哪个应用程序启动的组播组成员。为了缓解这种情况,每个应用程序都要监听它期望数据的多播地址,方法是将它指定为bind给出的地址tupel中的第一个参数。

+0

是的,看起来azhurb认为今天是这样。 – JAB

+0

@JAB我知道,这就是为什么这个答案被标记为社区维基。它有助于保持结构化的问题答案格式,如果能写得更好,编辑社区wiki答案比附加其他评论更好。 – phihag

+0

啊,我明白了。 – JAB