トピックを購読しているときにのみメッセージが失われています。ZeroMQ Pub/Subはトピックの購読時にのみメッセージをドロップします
サブスクライバは特定のトピックにサブスクライブし、別のスレッド(同じコンテキストと同じ「サブスクライブトピック」)でパブリッシャを呼び出します。
パブリッシャーは「購読トピック」を受信して発行します。
2つの手順(2つのサブスクライバスレッドと2つのパブリッシャスレッドを意味する)を実行すると、スレッドの1つに(ランダムに)1つのメッセージしか受信されません。
なぜ私は2番目のメッセージを失っているのか分かりません。
出版社のスレッド:
void *publisher = zmq_socket(ptStruct->zContext, ZMQ_PUB);
assert(0 == zmq_bind(publisher, "inproc://#1"));
printf("Publishes to %d \n", ptStruct->iID);
assert(-1 != zmq_send(publisher, &(ptStruct->iID), sizeof(ptStruct->iID), 0));
zmq_close(publisher);
加入者スレッド:
void *subscriber = zmq_socket(ptStruct->zContext, ZMQ_SUB);
assert(0 == zmq_connect(subscriber, "inproc://#1"));
assert(0 == zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, &(ptStruct->iID), sizeof(ptStruct->iID)));
printf("Subscribed to %d \n", ptStruct->iID);
/* Now run the publisher in a different thread */
OSTHREAD_CreateThread(&ptThread, publishThread, ptStruct, NULL);
assert(-1 != zmq_recv(subscriber, acRec, 255, 0));
printf("Got %d \n", acRec[0]);
zmq_close(subscriber);
は、私は二回、加入者のスレッドを実行し、これが出力されます:あなたは二つの異なるパブリッシャーを作成している
Subscribed to 1
Subscribed to 2
Publishes to 1
Got 1
Publishes to 2
興味深い..サブスクリプションでフィルタを使用していないときには機能しましたが、あなたはパブ/サブよりもこれを行う良い方法があると思いますか? (私はpub/subのような何かを必要とするので、多くの場合、多くの場合) – Drxxd
あなたのコミュニケーションを設計する最良の方法を本当に理解するのに十分な詳細はありません。 pub/subで多対多を行うことができます。それぞれのpubを独自のエンドポイントにバインドして、各サブスクライバを各パブに接続するだけで済みます。しかし、なぜあなたは複数のパブソケットが必要ですか?あなたが何をしようとしているのか理解していないと、あなたの場合には何が最善であるかを示唆することはできません。 – Jason