【发布时间】: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