Ошибка подтверждения на работнике ZeroMQ Majordomo

У меня возникла проблема с рабочим API ZeroMQ Majordomo, который не может быть подтвержден при использовании этого простого рабочего клиента.

Все, что я использую, это брокер из раздела с примерами на сайте ZeroMQ. Что такое m_reply_to используется и когда он установлен?

mdwrkapi.hpp:123: zmsg* mdwrk::recv(zmsg*&): Assertion `m_reply_to.size()!=0' failed.

Вот рабочий код.

  mdwrk session ("tcp://localhost:5555", "GenericData", verbose);

zmsg *reply = 0;
while (1) {
zmsg *request = session.recv (reply);
if (request == 0) {
break;              //  Worker was interrupted
}
reply = request;        //  Echo is complex… :-)
}

А вот и клиентская часть:

mdcli session ("tcp://localhost:5555", verbose);
int count = 1;
while(1) {
zmsg * request = new zmsg("Hello world");
zmsg * reply = session.send ("GenericData", request);

if (reply) {
delete reply;
} else {
continue;              //  Interrupt or failure
puts("Interupt or failure");
}
sleep(1);
puts("sleeping");
}

0

Решение

Что такое m_reply_to используется для?

Как взято из исходного кода Majordomo, m_reply_to объявлен как:

/*  =====================================================================
mdwrkapi.hpp

Majordomo Protocol Worker API
Implements the MDP/Worker spec at http://rfc.zeromq.org/spec:7.

---------------------------------------------------------------------
Copyright (c) 1991-2011 iMatix Corporation <www.imatix.com>
...
*/
...
private:
...
//  Return address, if any
std::string m_reply_to;  // <<------------------------- RETURN ADDRESS

и служит для хранения обратного адреса, как здесь, в recv():

                //  We should pop and save as many addresses as there are
//  up to a null part, but for now, just save one...
m_reply_to = msg->unwrap ();

Когда это установлено?

Как видно из исходного кода, это может произойти внутри recv():

//  ---------------------------------------------------------------------
//  Send reply, if any, to broker and wait for next request.

zmsg *
recv (zmsg *&reply_p)
{
//  Format and send the reply if we were provided one
zmsg *reply = reply_p;
assert (reply || !m_expect_reply);
if (reply) {
assert (m_reply_to.size()!=0);
...
1

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


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