使用pyzmq广播到子网地址

时间:2018-11-24 10:57:21

标签: python sockets zeromq publish-subscribe pyzmq

我正在尝试使用广播数据包到子网地址,我尝试使用套接字的广播选项成功地做到了这一点,但是最近我开始学习ZeroMQ,所以我想用它来将数据包广播到子网。我使用了zmq.PUBzmq.SUB,但是在订户端,由于我使用的是子网地址,因此数据包无法传递。如果我使用机器的IP地址,那么它可以工作,但是那不是我想要的。

可以使用ZMQ进行广播吗?


这是我到目前为止尝试过的代码:

发布者:

import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://192.X.X.255:9999")  # Note.

while True:
    socket.send_string('hello')
    time.sleep(1)

订户:

context = zmq.Context()
sub=context.socket(zmq.SUB)  # Note.
sub.setsockopt(zmq.SUBSCRIBE, b"")  # Note.
sub.connect('tcp://192.x.x.255:9999') -> publishing only to subnet

while True:
    print(sub.recv())

我们可以使用常规套接字广播数据包,例如,使用:

sock.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)

但是我想用ZMQ代替它。 ZMQ是否真的以不同的方式进行广播发现,还是应该使用与常规广播相同的代码?

1 个答案:

答案 0 :(得分:0)

假设您有三个机器(M1,M2,M3),它们具有三个具有相同子网和定义端口的不同IP地址。我们要在每个订户(M1,M2)上发布一条消息(来自M1),因此我们将具有以下代码段:

发布者(Machine1):

import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:9999")  # Note.

while True:
    socket.send_string('hello-all')
    time.sleep(1)

订户(机器2):

context = zmq.Context()
sub=context.socket(zmq.SUB)
sub.setsockopt(zmq.SUBSCRIBE, b"")
sub.connect('tcp://Machine1_IP:9999')  # Note

while True:
    print(sub.recv())

订户(机器3):

context = zmq.Context()
sub=context.socket(zmq.SUB)
sub.setsockopt(zmq.SUBSCRIBE, b"")
sub.connect('tcp://Machine1_IP:9999')  # Note

while True:
    print(sub.recv())