Ошибка утверждения на работнике 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");
}

1 ответ

Что такое 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);
        ...
Другие вопросы по тегам