я использую (Клиент)REQ->ROUTER
(Маршрутизатор)<-ROUTER
(Рабочий) Socket-схема.
Я мог бы отправить запрос клиента конкретному работнику, но не смог отправить ответ обратно клиенту, и это REQ
сокет и, следовательно, клиент зависает в ожидании ответа.
Много пытался, но не смог решить.
client.cpp
#include "zhelpers.hpp"#include <string>
int main (int argc, char *argv[])
{
zmq::context_t context(1);
zmq::socket_t requester(context, ZMQ_REQ);
requester.setsockopt(ZMQ_IDENTITY,"M");
requester.connect("tcp://localhost:5559");
for( int request = 0 ; request < 10 ; request++) {
std::string cmd;
std::cin>>cmd;
s_sendmore (requester, "B");//addressing workers
s_sendmore (requester, "");
s_send (requester, cmd);
s_dump(requester);
}
}
router.cpp
#include "zhelpers.hpp"int main(int argc, char *argv[]) {
zmq::context_t context(1);
zmq::socket_t frontend(context, ZMQ_ROUTER);
frontend.setsockopt(ZMQ_ROUTER_MANDATORY, 1);
frontend.bind("tcp://*:5559");
zmq::pollitem_t items[] = {
{frontend, 0, ZMQ_POLLIN, 0}
};
while (1) {
zmq::message_t source;
zmq::message_t empty1;
zmq::message_t destination;
zmq::message_t empty2;
zmq::message_t message;
int more;
zmq::poll(&items[0], 1, -1);
std::cout << "DEBUG MSGS NOT PRINTING";// Another issue
if (items[0].revents & ZMQ_POLLIN) {
while (1) {
// Process all parts of the message
frontend.recv(&source);
frontend.recv(&empty1);
frontend.recv(&destination);
frontend.recv(&empty2);
frontend.recv(&message);
size_t more_size = sizeof(more);
frontend.getsockopt(ZMQ_RCVMORE, &more, &more_size);
frontend.send(destination, ZMQ_SNDMORE);
frontend.send(empty1, ZMQ_SNDMORE);
frontend.send(source, ZMQ_SNDMORE);
frontend.send(empty2, ZMQ_SNDMORE);
frontend.send(message);
if (!more)
break;
}}}
return 0;
}
Так же cout
заявления в router.cpp
не печатать, Причина неизвестна?
worker.cpp
#include "zhelpers.hpp"int main (int argc, char *argv[])
{
zmq::context_t context(1);
zmq::socket_t responder(context, ZMQ_ROUTER);
responder.setsockopt(ZMQ_IDENTITY, "B", 1);
responder.connect("tcp://localhost:5559");
while(1)
{
s_dump(responder);
sleep (1);
s_sendmore (responder, "B");
s_sendmore (responder, "");
s_sendmore (responder, "M");
s_sendmore (responder, "");
s_send (responder, "FromSlaveB");
}}
Я на Ubuntu 16.04 и текущая версия 0MQ 4.0.5
cout
никогда не выполняет:Краткая проверка спецификации ZeroMQ API говорит вам:
int zmq_poll (zmq_pollitem_t *items, int nitems,
long timeout
);
…
Если значение Тайм-аут это -1,zmq_poll()
блокируется на неопределенный срок до тех пор, пока запрошенное событие не произошло хотя бы на одномzmq_pollitem_t
.
Поэтому для этого достаточно проверить документацию по API (на которую Мартин СУСТРИК потратил некоторое замечательное время с момента раннего выпуска v2.1.x).
REQ-ROUTER-ROUTER
Для простоты запустите и прототипируйте любое программное обеспечение сначала по стандартному, хорошо документированному сценарию — будь то REQ-REP
, XREQ-XREP
( == ROUTER-DEALER
) или любой другой задокументированный архетип Scalable Formal Communication Pattern, прежде чем переходить к более сложным мультисетям & многопартийная композитная смесь блокировок & неблокирующая расширенная передача сообщений & сигнальные сценарии, которые формируют желаемое, но очень сложное сочетание функций.
Если возможно, прочитайте полную книгу, как советовали в других ваших нескольких вопросах, прежде чем задавать другую не проверенную или неподдерживаемую настройку, и, скорее, не прыгайте, пока не освоите те тривиальные сценарии использования, которые книга помогает понять и опираться на.
cout
не печатает1) Проверьте это ниже
2) опубликовать наблюдаемый результат как другой вопрос по S / O #READYTOHELP
:
router_a_proof_of_print.cpp
#include "zhelpers.hpp"int main( int argc, char *argv[] ) {
std::cout << "DEBUG: [PASS|FAIL] ON AN ATTEMPT TO PRINT"; // Another issue
return 0;
}
Других решений пока нет …