有没有办法知道 ZeroMQ 消息来自哪里?

3

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

1个回答

7
不,无法从ZeroMq套接字中获取发送者的IP。该信息隐藏在ZeroMq的实现层中。您有几个选择来解决这个问题,一个是更改传递的消息并将发送者的IP简单地添加到消息本身中,另一个是使用多部分消息。来自ZeroMq zmq_send() Api文档(3.2.2)的内容如下:一个 ØMQ 消息由 1 个或多个消息部分组成。每个消息部分都是独立的 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() 的文档。


我该如何在本地确定 ZMQ 用于发送消息的 IP 地址? - AlexLiesenfeld
通常情况下,您会将套接字绑定到所选的端点。该端点(IP + 端口)是ZMQ用于发送消息的内容。 - Jakob Möllås

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接