ZeroMQ с NORM — адрес уже используется ошибка была брошена на 2 .bind () — почему?

Я использую ZeroMQ с NACK-ориентированной надежной многоадресной передачей (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

Решение

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

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

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

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

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

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

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


Смущенный ?

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]