【问题标题】:Broadcasting to subnet address using pyzmq使用 pyzmq 广播到子网地址
【发布时间】:2018-11-24 10:57:21
【问题描述】:

我正在尝试使用广播数据包到子网地址,我成功地尝试使用套接字的广播选项来做到这一点,但是我最近开始学习 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 是否真的以不同的方式进行广播发现,或者我们应该使用与常规广播相同的代码?

【问题讨论】:

  • 我不知道“子网地址”的含义,但是在发布者端使用.bind("tcp://*:1234"),每个订阅者都可以连接它并通过.connect("tcp://publisher-ip:1234")通过ZMQ获取消息,Is'不是你要找的东西吗?
  • 嗨,子网地址是ip地址和广播地址的混合,例如只有连接到路由器wifi的ppl才能收到我们发送的消息。地址看起来像 192.167.1.255,你可以在你的 ifconfig 中看到。所以这将避免向所有人发送消息。(255.255.255.255)@Benyamin jafari。我的发布者和订阅者都将使用相同的子网地址。一个发布,另一个给订阅者。
  • 嗨,我想还是不明白你的意思。所以我举个例子作为答案,如果对你没有帮助,我会删除它。
  • @BenyaminJafari 您发布的答案可能仅对想要发布到整个网络的发布者有所帮助。 “*”这意味着我认为 255.255.255.255 地址。每个人都可以听发布者,我希望它是私有的,这就是我使用子网地址的原因。顺便说一句,如果你能帮忙,除了 pub-sub 或任何消息传递模式之外,我真的需要找到一种 zmq 方式来广播 udp 数据包。

标签: python sockets zeromq publish-subscribe pyzmq


【解决方案1】:

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

发布者(机器 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())

【讨论】:

  • 完美,节省了我数小时的挖掘时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 2015-05-16
  • 2010-10-21
  • 2011-02-28
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多