如果我通过ZeroMQ(0MQ)套接字上的recv()方法收到消息...
data = s.recv()
...有没有办法让我获得底层套接字getpeername()
的值?我的目标是以不依赖发件人提供准确信息的方式识别邮件的来源。
我正在使用ZMQ(通过Python)收集主机指标,从接收者的角度来看发件人的地址是一个有用的标识符。
或者这只是一个坏主意?
答案 0 :(得分:3)
不,您无法从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);
答案 1 :(得分:3)