在此代码中,订阅者(在subscriber.cpp
代码中)套接字绑定到端口5556。
它接收来自发布者的更新/消息(在subscriber.cpp
中),发布者套接字在5556连接到订阅者并向其发送更新/消息。
我知道约定是.bind()
发布商而不是在其上调用.connect()
。但从理论上讲,每种套接字类型都可以.bind()
或.connect()
。
但是,这两个代码在运行时都会出现zmq错误。 为什么?
这是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;
}
答案 0 :(得分: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属性,以便最大限度地减少迟来者的综合效应。
答案 1 :(得分:0)
反向bind()/ connect()没有问题。 当我更改行时,代码正在运行 - subscriber.bind(“tcp:// localhost:5556”); 至 subscriber.bind( “TCP:// :5556”); 和 publisher.connect( “TCP:// :5556”); 至 publisher.connect( “TCP://本地主机:5556”);