Выявление происхождения сообщений ZMQ? - PullRequest
4 голосов
/ 07 марта 2012

Если я получаю сообщение через метод recv () на сокете ZeroMQ (0MQ) ...

data = s.recv()

... есть ли способ получить значение getpeername() для основного сокета? Моя цель состоит в том, чтобы определить источник сообщения таким образом, чтобы отправитель не предоставил точную информацию.

Я использую ZMQ (через Python) для сбора метрик узла, а адрес отправителя с точки зрения получателя является полезным идентификатором.

Или это просто плохая идея?

Ответы [ 2 ]

3 голосов
/ 03 марта 2014

Похоже, это недавно появилось в github: https://github.com/zeromq/libzmq/commit/3aeaa6fab135aced3e762031621491c4779285c0

3 голосов
/ 12 февраля 2013

Нет, вы не можете получить адрес отправителя из ZeroMq.У вас есть два варианта;добавить информацию об адресе отправителя в само сообщение (неплохой вариант, если вам разрешено изменять существующие структуры сообщений) или добавить адрес отправителя в качестве части сообщения, т. е. использовать сообщения из нескольких частей ZeroMq.

Сообщение, состоящее из нескольких частей, все равно будет доставлено целиком (все части или не все), но вы можете извлекать части по отдельности на стороне получателя, таким образом вы можете добавить или добавить адрес отправителя к любомусуществующие сообщения, фактически не касаясь их (и все равно доставляя оба адреса + сообщения как элементарную операцию).

Я не уверен, как это реализовано в привязке pyzmq, но за подробностями обращайтесь к источнику socket.pyx (в основном, используйте флаг SNDMORE в методе send (..)).

Кроме того, взгляните на ZeroMq zmq_send () Api docs (3.2.2).

В C ++ это будет выглядеть примерно так:

// Send a multi-part message consisting of sender IP plus another message
zmq_msg_send (&my_ip, my_socket, ZMQ_SNDMORE);
zmq_msg_send (&my_message, my_socket, 0);
...