我正在使用ZeroMQ和NACK-Oriented Reliable Multicast(NORM)norm://
协议。该文档仅包含Python代码,因此这是我的C ++代码:
PUB
发件人:
string sendHost = "norm://2,127.0.0.1:5556";// <NormNodeId>,<addr:port>
string tag = "MyTag";
string sentMessage = "HelloWorld";
string fullMessage = tag + sentMessage;
zmq::context_t *context = new zmq::context_t( 20 );
zmq::socket_t publisher( *context, ZMQ_PUB );
zmq_connect( publisher, sendHost.c_str() );
zmq_send( publisher,
fullMessage.c_str(),
fullMessage.size(),
0
);
SUB
接收方:
char message[256];
string receiveHost = "norm://1,127.0.0.1:5556";// <NormNodeId>,<addr:port>
string tag = "MyTag";
zmq::context_t *context = new zmq::context_t( 20 );
zmq::socket_t subscriber( *context, ZMQ_SUB );
zmq_bind( subscriber, receiveHost.c_str() );
zmq_setsockopt( subscriber, ZMQ_SUBSCRIBE, tag.c_str(), tag.size() );
zmq_recv( subscriber,
message,
256,
0
);
cout << bytesReceived << endl;
cout << message << endl;
我面临的问题是,根据documentation,.bind()
和.connect()
都可以互换。
在我的情况下,他们都做了.bind()
,这导致ZeroMQ抛出一个错误,说第二个绑定失败,因为地址已经在使用错误。
答案 0 :(得分:1)
...他们都执行绑定,这会导致ZeroMQ抛出错误,说明第二次绑定失败
第一个 .bind()
“取得了该端口的所有权”,这是一个独家角色。
<{strong> { .bind() | .connect() }
的可互换性应理解为无论哪一方.bind()
-s以及哪一方无关紧要.connect()
强> -s
直到这一刻,我看到没有人以这种方式解释这个属性,双方都会尝试.connect()
(一个不存在的.bind()
- (未) - 暴露的接入点),尝试.bind()
已经“占用”的端口(如果驻留在同一个本地主机上),或者保持在nox-et-solitudo状态,对于{{1}的任何一种情况-s在不同的localhost-s上的两个端口上建立了这样一个.bind()
就绪状态,这两个端口之后都保持静默孤独(永远),因为(并且将来)没有尝试进行任何{ {1}} - 离子上线和运行。
不,您需要 .connect()
.connect()
,从那时起可以处理 1
以后.bind()
- 已经到达以建立实时频道0+
,用于任何相应的 .connect()
协议,包括新添加的 PUB/SUB
。
无论如何,欢迎 <transport-class>
加入ZeroMQ协议系列。
可以享受再进行5秒阅读 关于 [ ZeroMQ hierarchy in less than a five seconds ] 或其他帖子和讨论here中的主要概念差异。