ZeroMQ Majordomo worker上的断言错误

Assertion error on ZeroMQ Majordomo worker

本文关键字:断言 错误 Majordomo worker ZeroMQ      更新时间:2023-10-16

我遇到了ZeroMQ Majordomo worker API的一个问题,使用这个简单的worker client,它在断言时失败。

我使用的代理全部来自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");
}

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);
        ...