3

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

4

1 回答 1

7

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

来自 ZeroMq zmq_send() Api 文档(3.2.2):

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

Multi-Part 消息实际上是原子消息,但被分成几个逻辑消息。即您收到所有零件或没有零件。如果您无法修改原始消息,您可以在消息(在发件人端)前面加上发件人的 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()的文档。

于 2013-02-01T22:09:51.903 回答