2012-03-07 3 views
3

Если я получаю сообщение с помощью метода RECV() на (0MQ) гнездо ZeroMQ ...Идентификация происхождения сообщений ZMQ?

data = s.recv() 

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

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

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

+1

Что вы можете получить является GUID идентификатор отправителя, но не данные вы в противном случае собираете с помощью 'getpeername'. Следующая ссылка может помочь: http://lists.zeromq.org/pipermail/zeromq-dev/2011-June/012041.html –

ответ

2

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

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

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

Также ознакомьтесь с ZeroMqApi 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);