2012-03-07 52 views
3

如果我通过在ZeroMQ(0MQ)插座的recv()方法收到一条消息......识别ZMQ消息的来源?

data = s.recv() 

...有没有什么办法,我让在getpeername()为基础套接字值?我的目标是以不依赖发件人提供准确信息的方式确定邮件的来源。

我正在使用ZMQ(通过Python)来收集主机度量标准,并且从接收方的角度来看发送方的地址是一个有用的标识符。

或者这只是一个坏主意?

+1

你能得到的是发送者的GUID标识符,而不是数据否则你会用'getpeername'收集。以下链接可能会有所帮助:http://lists.zeromq.org/pipermail/zeromq-dev/2011-June/012041.html – 2012-03-07 16:10:43

回答

2

不,您无法从ZeroMq获取发件人的地址。你基本上有两个选择;将发件人地址信息添加到邮件本身(如果您允许修改现有邮件结构,则不是一个错误的选项),或将发件人地址添加为邮件部分,即使用ZeroMq多部分邮件。

多部分消息仍将作为一个整体(全部或全部)交付,但您可以在接收端单独提取部件,因此您可以将发件人地址追加或预先添加到任何现有消息而没有实际触摸它们(并且仍然将地址+消息作为原子操作递送)。

我不确定这是如何在pyzmq绑定中实现的,但请查看socket.pyx source以获取详细信息(基本上,使用send(..)方法中的SNDMORE标志)。

另外,看看ZeroMq zmq_send() Api文档(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);