带有NORM的ZeroMQ - 已经在使用中的地址错误被抛到第二个.bind() - 为什么?

时间:2018-06-08 04:53:57

标签: c++ zeromq distributed-system

我正在使用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抛出一个错误,说第二个绑定失败,因为地址已经在使用错误。

1 个答案:

答案 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中的主要概念差异。