Трансляция на адрес подсети с помощью pyzmq - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь использовать широковещательные пакеты для адреса подсети, я успешно попытался сделать это с помощью опции широковещания сокета, но недавно я начал изучать ZeroMQ, поэтому я хотел бы использовать его для широковещательной передачи пакетов в подсеть.Я использовал zmq.PUB, zmq.SUB, но на стороне подписчика пакеты не доставлены, потому что я использую адрес подсети.Если я использую IP-адрес устройства, он работает, но это не то, что я хочу.

Есть ли возможность вещания с использованием ZMQ?


Вот код, который я пытался сделать такfar:

Издатель:

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 голосов
/ 24 ноября 2018

Предположим, у вас есть три машины (M1, M2, M3) с тремя разностными IP-адресами с той же подсетью и определенным портом.Мы хотим опубликовать сообщение (от M1) для каждого подписчика (M1, M2), поэтому у нас будет следующий фрагмент кода:

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

Подписчик (Machine2):

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

Подписчик (Machine3):

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