有没有办法告诉ZeroMQ消息来自哪里?

时间:2013-02-01 19:51:57

标签: zeromq

我有一个ZeroMQ套接字,它从不同机器上的多个进程接收数据。在不改变数据内容的情况下,有没有办法识别数据来源?具体来说,如果它来自TCP连接,我想要发件人的IP地址。

1 个答案:

答案 0 :(得分:7)

不,无法从ZeroMq套接字获取发件人IP。该信息隐藏在ZeroMq的实现层中。您有两个选择来解决这个问题,一个是更改传递的消息,只需将发件人IP添加到消息本身,另一个是使用多部分消息。

来自ZeroMq zmq_send() Api docs(3.2.2):

  

ØMQ消息由一个或多个消息部分组成。每个消息部分本身都是一个独立的zmq_msg_t。 ØMQ确保消息的原子传递:对等体应接收消息的所有消息部分或根本不接收消息部分。除可用内存外,消息部分的总数不受限制。

多部分消息实际上是原子消息,但分成几个逻辑消息。即你收到所有零件或没有零件。如果您无法修改原始邮件,则可以使用发件人的IP预先添加邮件(在发件人方)。然后,接收器可以将第一部分提取为发送者IP,将第二部分提取为原始的未修改消息。它将作为单个消息发送,但在逻辑上分为两个谨慎的部分。

在你的情况下,你可以这样做:

// 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);

有关接收器,请参阅zmq_msg_recv()的文档。