Sockets 使用ZEROMQ和NORM将数据包多播到大量WiFI设备
我正在尝试使用ZeroMQ和NORM协议通过无线网络发送文件。我目前正在使用PUB/SUB模式,因为据我所知,这是NORM和ZeroMQ支持的唯一模式 我已经把它设置好了,这样小消息就可以很好地传递了,但有时候接收者不会收到消息。从那时起,消息就被丢弃了。偶尔可以通过重新启动发布服务器或订阅服务器来解决此问题,但不是每次都可以。我已经尝试过调整发送的比特数和每次呼叫之间的发送时间,但没有效果。在连接变得不稳定之前,我似乎可以接收大约20-60条多播消息。如果我使用相同的代码,但使用TCP进行设置,则连接会更加可靠,在错误发生之前,连接的数量大约为数千条消息 我尝试实现一个包装器类,在一段不活动的时间后重新启动订阅者,但没有成功。在while循环中设置socket.recv(zmq.NOBLOCK)也是如此 我知道这里描述的发布子同步模式,但是ZeroMQ的NORM_engine.cpp()中实现的NORM看起来不允许这种模式 是否有办法重新发送丢失的数据包,或确保健康的多播连接 代码是Python 出版商:Sockets 使用ZEROMQ和NORM将数据包多播到大量WiFI设备,sockets,python-2.7,network-programming,zeromq,network-protocols,Sockets,Python 2.7,Network Programming,Zeromq,Network Protocols,我正在尝试使用ZeroMQ和NORM协议通过无线网络发送文件。我目前正在使用PUB/SUB模式,因为据我所知,这是NORM和ZeroMQ支持的唯一模式 我已经把它设置好了,这样小消息就可以很好地传递了,但有时候接收者不会收到消息。从那时起,消息就被丢弃了。偶尔可以通过重新启动发布服务器或订阅服务器来解决此问题,但不是每次都可以。我已经尝试过调整发送的比特数和每次呼叫之间的发送时间,但没有效果。在连接变得不稳定之前,我似乎可以接收大约20-60条多播消息。如果我使用相同的代码,但使用TCP进行设置
import zmq
import time
import os
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.connect("norm://224.0.0.1:3000")
i = 1
imgfile_path = "/home/adam/programs/zmq/tux.svg.png"
imgsize = os.stat(imgfile_path).st_size
print "attempting to send", imgsize, "bytes"
sleep_time = 1
topic = ""
packet_size = 500
left = packet_size
f = open(imgfile_path, 'rb')
fi = f.read(packet_size)
while (imgsize - left) > packet_size:
print "sent packet number:", i
print "size: ", len(topic + str(i)[-1] + fi)
i += 1
socket.send(topic + str(i)[-1] + fi)
fi = f.read(packet_size)
left += packet_size
time.sleep(sleep_time)
print imgsize, left
time.sleep(sleep_time)
fi = f.read(imgsize - left)
print fi
socket.send(topic + " " + fi)
f.close()
订户:
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.bind("norm://224.0.0.2:3000")
socket.setsockopt(zmq.SUBSCRIBE, "")
imgdir = "/home/adam/programs/zmq/img/"
filename = "tux.svg.png"
destfile = imgdir + filename
packet_size = 501
print "attempting to receive"
f = open(destfile, 'wb')
while True:
msg = None
while msg is None:
try:
msg = socket.recv(zmq.NOBLOCK)
except:
pass
if msg:
print "msg = ", msg[0]
print "we got something", len(msg)
f.write(msg[1:])
if len(msg) < packet_size:
break
f.close()
print "exiting..."
导入zmq
context=zmq.context()
socket=context.socket(zmq.SUB)
socket.bind(“norm://224.0.0.2:3000")
socket.setsockopt(zmq.SUBSCRIBE,“”)
imgdir=“/home/adam/programs/zmq/img/”
filename=“tux.svg.png”
destfile=imgdir+filename
数据包大小=501
打印“正在尝试接收”
f=打开(文件“wb”)
尽管如此:
msg=无
虽然msg是None:
尝试:
msg=socket.recv(zmq.NOBLOCK)
除:
通过
如果消息:
打印“msg=”,msg[0]
打印“我们有东西”,len(msg)
f、 写入(消息[1:])
如果len(msg)<数据包大小:
打破
f、 关闭()
打印“退出…”
此外,一旦我可以确保我可以发送一个文件,我想调整前向纠错和NACK速率,这就是为什么NORM对我如此有用的原因。有没有一种方法可以在不重新编写norm_engine.cpp的情况下执行此操作
谢谢 您假设的一些事情在文档页面上得到了确认。也就是说,目前,它只是发布/订阅,尽管您确实能够通过使用发布/订阅的NORM和REQ/REP的TCP进行链接的同步 否则,我相信在规范实施阶段的早期,您仍然会受到这种情况的困扰,因为(也是从我的链接)它讨论了所有尚未完成的事情。那是一年前的事了,但从那以后,我没看到有多少人谈论这件事 根据您的基础设施的具体情况,多播甚至可能不是最佳选择,正如所讨论的,没有一种多播协议是为当今的高性能网络速度而设计的。您的实现可能会成为这些传输协议自然产生的问题的不良恢复的受害者 编辑: 根据您帖子中的github链接,代码自2014年3月19日(我上面链接的页面发布的同一天)以来一直没有更新,因此它在ZMQ中提到的任何关于标准传输的内容都应该是最新的 在页面底部,关于ZMQ规范实现可以做什么和不能做什么的要点:
- NORM能够为应用程序提供类似UDP的“尽力而为”和“优于尽力而为”(使用数据包擦除编码)的交付服务。这将包括对范数FEC编码参数的控制
因此,看起来它(在当前状态下)并没有为您提供任何对前向纠错的控制,只是在默认的反应(高性能)状态下使用它。默认情况下,这将为您的连接提供可靠性,但如果ZMQs实现没有完全完成,它可能会比您希望的更脆弱。由于缺少内容和补丁,我认为它还没有为您准备好。谢谢。我试图突破多播的界限,并认为人们可以用这种方式传输数据。希望使用NORM的前向误差校正来缓解速度问题。你听说过类似的事情吗?更新了我的答案,提供了有关FEC的更多细节