сокеты — ZMQ C ++ Отправка и получение от конкретного работника

я использую (Клиент)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

2

Решение

Более простая часть — почему 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, прежде чем переходить к более сложным мультисетям & многопартийная композитная смесь блокировок & неблокирующая расширенная передача сообщений & сигнальные сценарии, которые формируют желаемое, но очень сложное сочетание функций.

Если возможно, прочитайте полную книгу, как советовали в других ваших нескольких вопросах, прежде чем задавать другую не проверенную или неподдерживаемую настройку, и, скорее, не прыгайте, пока не освоите те тривиальные сценарии использования, которые книга помогает понять и опираться на.


Post Festum: в случае проблем с предполагаемым 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]