Я использую 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 выдает ошибку, сообщающую, что второе связывание завершилось неудачно из-за ошибки уже используемого адреса.
… 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 менее чем за пять секунд] или другие сообщения и обсуждения Вот.
Других решений пока нет …