有一个脚本可以打开一个套接字并从中读取多播(来自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 :(得分:3)
监听端口上所有传入连接的应用程序将获得该端口的所有消息,无论哪个应用程序启动了多播组成员身份。为了缓解这种情况,让每个应用程序通过将其指定为bind
的地址分贝中的第一个参数来侦听它期望数据的多播地址。