ZeroMQ с NORM - адрес уже используется ошибка была брошена на 2 .bind () - почему? - PullRequest
0 голосов
/ 08 июня 2018

Я использую 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;

Проблема, с которой я сталкиваюсь, заключается в том, что согласно документации оба .bind() и .connect() являются взаимозаменяемыми.

В моем случае они оба делают .bind(), в результате чего ZeroMQ выдает ошибку, сообщающую, что второе связывание не выполнено из-за ошибки уже используемого адреса.

1 Ответ

0 голосов
/ 08 июня 2018

... они оба выполняют связывание, в результате чего ZeroMQ выдает ошибку, сообщающую , что второе связывание завершается неудачей

Да, это правильное состояние для сбоя.

Первый .bind() «становится владельцем» порта, и это исключительная роль.

Взаимозаменяемость { .bind() | .connect() } следует понимать так, что не имеет значения , с какой стороны .bind() -а, а с какой .connect() -с.

До этого момента я не видел, чтобы никто не интерпретировал это свойство таким образом, чтобы обе стороны пытались .connect() (несуществующая .bind() - (не) -экспонированная точка доступа),тем меньше попытаться .bind() уже «занятый» порт (в случае нахождения на том же локальном хосте) или остаться в состоянии nox-et-solitudo, для случаев, когда любой из .bind() -s устанавливаеттакое состояние .connect() на обоих портах разных localhost-ов, которые оба после этого остаются в безмолвном уединении (навсегда), как есть (так и будет)) не пытайтесь заставить любой .connect() -ион начать работу и работать.

Нет, вам нужно просто 1 .bind(), которое может с этого момента обрабатывать 0+ будущие .connect() -запросы, прибывающие для установления прямого канала PUB/SUB, для любого соответствующего протокола <transport-class>, включая недавно добавленный norm://.

В любом случае, добро пожаловать norm:// в семейство протоколов ZeroMQ.


В замешательстве?

Может наслаждайтесь читайте еще 5 секунд
об основных концептуальных различиях в [иерархия ZeroMQ менее чем за пять секунд] или другие сообщения и обсуждения здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...