首页 文章

在ZeroMQ中绑定订阅者套接字并连接发布者套接字在运行代码时会出错 . 为什么?

提问于
浏览
0

在此代码中,订阅服务器(在 subscriber.cpp 代码中)套接字绑定到端口5556 .

它接收来自发布者的更新/消息(在 subscriber.cpp 中),发布者套接字在5556连接到订阅者并向其发送更新/消息 .

我知道约定是 .bind() 一个发布者,而不是在它上面调用 .connect() . 但理论上每个套接字类型都可以 .bind().connect() .

但是,这两个代码在运行时都会出现zmq错误 . Why?

这是CPP代码 .

publisher.cpp

#include <iostream>
#include <zmq.hpp>
#include <zhelpers.hpp>

using namespace std;
int main () {

zmq::context_t context (1);
zmq::socket_t publisher(context, ZMQ_PUB);
publisher.connect("tcp://*:5556");
while (1) {

    zmq::message_t request (12);
    memcpy (request.data (), "Pub-1 Data", 12);
    sleep(1);
    publisher.send (request);
}
return 0;
}

subcriber.cpp

#include <iostream>
#include <zmq.hpp>

int main (int argc, char *argv[])
{
zmq::context_t context (1);
zmq::socket_t subscriber (context, ZMQ_SUB);
subscriber.bind("tcp://localhost:5556");
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);
    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;
}

2 回答

  • 0

    不,反转.bind()/ . connect()没有问题

    这主要是正常的 .

    然而, PUB/SUB 正式原型是subject to a so called late-joiner syndrome.

    如上所述,如果没有彻底的调试细节,可以重复一般的经验法则:

    在较新的API版本中,可以
    添加 rc = <aSocket>.setsockopt( ZMQ_CONFLATE, 1 ); assert( rc & "CONFLATE" );
    添加 rc = <aSocket>.setsockopt( ZMQ_IMMEDIATE, 1 ); assert( rc & "IMMEDIATE" );
    等等,
    所有这些都是为了更好地调整context-instance socket-instance属性,以便最小化late-joiner综合症效应 .

  • 0

    反向bind()/ connect()没有问题 . 当我更改行时,代码正在运行 - subscriber.bind("tcp://localhost:5556"); to subscriber.bind(“tcp://:5556 "); and publisher.connect(" tcp://:5556 "); to publisher.connect(" tcp:// localhost:5556”);

相关问题