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