4

如果我通过ZeroMQ (0MQ) 套接字上的 recv() 方法收到一条消息...

data = s.recv()

...有什么方法可以让我获得getpeername()底层套接字的价值吗?我的目标是以一种不依赖发件人提供准确信息的方式来识别消息的来源。

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

或者这只是一个坏主意?

4

2 回答 2

3

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

多部分消息仍将作为一个整体传递(所有部分或根本不传递),但您可以在接收端单独提取部分,因此您可以将发件人地址附加或附加到任何现有消息而无需实际接触它们(并且仍然将地址+消息作为原子操作传递)。

我不确定这是如何在 pyzmq 绑定中实现的,但请查看socket.pyx 源以获取详细信息(基本上,在 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);
于 2013-02-11T21:19:09.160 回答
3

看起来这最近登陆了 github:https ://github.com/zeromq/libzmq/commit/3aeaa6fab135aced3e762031621491c4779285c0

于 2014-03-02T23:19:49.040 回答