Python多播接收器中的重复数据包
有一个脚本可以打开一个套接字,并从中读取多播数据(关于多播的内容可以参考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那样做,但结果也是一样。
这为什么会发生?有什么办法解决吗?
更新 修复
-sock.bind(('', MCAST_PORT))
+sock.bind((MCAST_GRP, MCAST_PORT))
1 个回答
3
一个应用程序如果在某个端口上监听所有的连接,就会收到发往这个端口的所有消息,不管是哪个应用程序发起的多播组成员资格。为了避免这种情况,建议每个应用程序只监听它期待接收数据的多播地址,方法是将这个地址作为第一个参数放在传给bind
的地址元组里。