ZeroMQにPUB/SUB
という問題があります。ZeroMQ SUBはメッセージを受信しません
すべてを接続した後、発行者は、すべてのメッセージを公開する(ソケットの送信メッセージがtrue
を返す)が、SUB
は.recv()
機能に永遠に彼らとブロックを受け取ることはありません。ここで
は、私が使用していますコードです:
void startPublisher()
{
zmq::context_t zmq_context(1);
zmq::socket_t zmq_socket(zmq_context, ZMQ_PUB);
zmq_socket.bind("tcp://127.0.0.1:58951");
zmq::message_t msg(3);
memcpy(msg.data(), "abc", 3);
for(int i = 0; i < 10; i++)
zmq_socket.send(msg); // <-- always true
}
void startSubscriber()
{
zmq::context_t zmq_context(1);
zmq::socket_t zmq_socket(zmq_context, ZMQ_SUB);
zmq_socket.connect("tcp://127.0.0.1:58951");
zmq_socket.setsockopt(ZMQ_SUBSCRIBE, "", 0); // allow all messages
zmq::message_t msg(3);
zmq_socket.recv(&msg); // <-- blocks forever (message never received?)
}
も試してみました(私は、2つの異なるスレッドでこれらの2つの機能をruningて最初SUB
スレッドを開始、いくつかの時間を待った後、出版社のスレッドを開始していますのでご注意くださいそれ以外の方法では、エンドレスループでメッセージを送信するが、動作しなかった)。
私はここで間違っていますか?
サブスクライバは、ドキュメンテーション/例の一部として、そしてパブリッシャの最初に実行する必要があります。サブスクライバスレッドの開始とパブリッシャスレッドの開始の間に遅延を追加して、それが違いを生むかどうかを確認します。後に適切な同期を追加することができます。 "tcp:// *:58951" –
こんにちは、私はちょうどこの問題を解決することができました...これは "遅い結合者"と呼ばれ、[ここ](http:// zguide .zeromq.org/page:all)を詳しく説明します。つまり、TCPハンドシェイクが完了するまでに時間がかかるため、接続が確立されます。しかし、あなたは絶対に正しかったです。 – carobnodrvo
これは、サブとパブの開始点の間に適切なシンクメカニズムを提供することで解決できます。 –