我有一个ZeroMQ套接字,它从不同机器上的多个进程接收数据.在不改变数据内容的情况下,有没有办法识别数据来源?具体来说,如果它来自TCP连接,我想要发件人的IP地址.
不,没有办法从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);
Run Code Online (Sandbox Code Playgroud)
有关接收器,请参阅zmq_msg_recv()的文档.