Ich habe Probleme mit einem PUB/SUB
in ZeroMQ.ZeroMQ SUB empfängt nie Nachrichten
Nachdem alles verbindet, veröffentlicht Publisher alle Nachrichten (Buchse des Nachrichtens kehrt true
), aber die SUB
nie empfängt sie und sperrt für immer auf .recv()
Funktion.
Hier ist der Code ich verwende:
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?)
}
Bitte beachten Sie, dass ich diese zwei Funktionen in zwei verschiedenen Threads bin runing, beginnend SUB
Faden zunächst für einige Zeit warten und dann Verleger Thread starten (auch versucht, andersherum mit dem Verleger Senden von Nachrichten in einer Endlosschleife, hat aber nicht funktioniert).
Was mache ich hier falsch?
Der Abonnent muss zuerst als Teil der Dokumentation/Beispiel und dann der Herausgeber ausgeführt werden. Fügen Sie eine Verzögerung zwischen dem Start des Abonnententhreads und dem Start des Publisher-Threads hinzu, um festzustellen, ob dies einen Unterschied macht. Sie können nachher eine korrekte Synchronisation hinzufügen. Setze deine Binde auch so bitte: "tcp: // *: 58951" –
Hallo, ich habe gerade dieses Problem gelöst ... Das nennt sich "slow joiner" und wird [hier] beschrieben (http://zguide.org/) .zeromq.org/page: all) im Detail. Kurz gesagt: Es dauert einige Zeit, bis der TCP-Handshake beendet ist und die Verbindung hergestellt ist. Aber du hattest absolut recht. – carobnodrvo
Dies könnte gelöst werden, indem ein geeigneter Synchronisationsmechanismus zwischen dem Start des Subs und Pub bereitgestellt wird. –