订阅者是否能够通过cpp绑定从ZeroMQ中的多个发布者接收更新?

时间:2018-03-07 13:27:37

标签: c++ zeromq publish-subscribe

在我的代码中,我只能接收来自我连接的第一个发布者(在端口5556上)的消息。

在连接到第二个连接(5557)之前,我需要关闭第一个连接(5556)吗?

如果是,那么在ZeroMQ指南的声明中

  

"订阅者可以连接到多个发布者,每次使用一次连接呼叫。然后数据将到达并交错("公平排队"),以便没有一个发布者淹没其他人。"

短语" 每次使用一次连接呼叫"是否需要在连接第二个发布者之前关闭第一个连接?

如何同时连接多个发布者以接收来自两者的消息。

代码:

#include <zmq.hpp>
#include

int main (int argc, char *argv[])
{
zmq::context_t context (1);
zmq::socket_t subscriber (context, ZMQ_SUB);

subscriber.connect("tcp://localhost:5556");
subscriber.connect("tcp://localhost:5557");
subscriber.setsockopt(ZMQ_SUBSCRIBE, "", 0);//subscribe to all messages

//  Process 10 updates
int update_nbr;
for (update_nbr = 0; update_nbr < 10 ; update_nbr++) {

    zmq::message_t update;
    subscriber.recv (&update);

 // Prints only the data from publisher bound to port 5556

    std::string updt = std::string(static_cast<char*>(update.data()), update.size());
    std::cout << "Received Update/Messages/TaskList " << update_nbr <<" : "<< updt << std::endl;

}
return 0;
}

1 个答案:

答案 0 :(得分:0)

这是否意味着我们需要在第二个之前关闭第一个?

没有。

不需要.close(),以便启动对.connect(...)方法的另一次调用。

如何连接多个PUB -s以接收来自两者的消息?

如果在 SUB - 旁边的公平排队 { PUB | SUB } -side政策和相同的主题过滤政策逻辑处理(版本依赖......)仍然合理:

int main (int argc, char *argv[])
{
zmq::context_t context (1);
zmq::socket_t subscriber (context, ZMQ_SUB);

subscriber.connect( "tcp://localhost:5556" ); // ipc://first   will have less
subscriber.connect( "tcp://localhost:5557" ); // ipc://second  protocol overheads

subscriber.setsockopt( ZMQ_SUBSCRIBE, "", 0 );// subscribe to .recv() any message
...
}

如果不是,请使用多个SUB - 套接字实例,每个.connect() - 分别对应各种非均衡 PUB -s并在事件循环中使用非阻塞 .poll() ,经过严格设计,以便临时监控和处理非下的所有非平衡消息到达事件流每个PUB/SUB(或XPUB/XSUB)共存消息“event-streams”正在处理相关的主题过滤策略。