有打开一个套接字,并从中读取组播的脚本(从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'模块不是线程安全的(http://bugs.python.org/issue1544279),但从Python 2.5版本开始已经修复了, 。 – JAB
今天我试图在python3上运行这个脚本 - 结果是一样的。 – azhurb
Wait ...将套接字绑定到空主机然后再分配主机有什么作用? – JAB