首页 > 解决方案 > 使用 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 是否真的以不同的方式进行广播发现,或者我们应该使用与常规广播相同的代码?

标签: pythonsocketszeromqpublish-subscribepyzmq

解决方案


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

发布者(机器 1):

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())

推荐阅读