繁体   English   中英

ZeroMQ Pub/Sub - 以错误的顺序读取消息和主题

[英]ZeroMQ Pub/Sub - Message and Topic being read in wrong order

问题

你好。 我正在编写一些代码来使用 ZeroMQ 在 tcp 上设置发布者/订阅者通信。 到目前为止,我已经设法根据主题发送和接收数据,但是。 订阅者将主题读取为消息,将消息读取为主题。 i:e 子程序打印:


  • 主题:酒吧打招呼
  • 消息:ABC

代替


  • 主题:ABC
  • 消息:酒吧打招呼

我在这里有点茫然,因为我似乎无法弄清楚为什么会发生这个错误。 任何帮助是极大的赞赏: :)

这是我的代码:

出版商

int Send_Dummy_Data(const std::string tpc, std::string data)
{
    zmq::context_t context(1);
    zmq::socket_t output_publisher(context, ZMQ_PUB);
    std::string transport("tcp://*:5556");
    output_publisher.bind(transport);

    while (true)
    {
        zmq::message_t topic(tpc.length());
        zmq::message_t message(data.length());

        memcpy(topic.data(), tpc.data(), tpc.size());
        memcpy(message.data(), data.data(), data.length());

        try
        {
            output_publisher.send(topic, zmq::send_flags::sndmore);
            output_publisher.send(message, zmq::send_flags::dontwait);
        }
        catch (zmq::error_t &e)
        {
            std::cout << e.what() << std::endl;
            return -1;
        }

        message.rebuild(data.length());
        topic.rebuild(tpc.size());
    }

    return 0;
}

int main(int argc, char *argv[])
{
    Send_Dummy_Data("ABC", "Pub says hello");
    return 0;
}

订户

void sub()
{

    const std::string TOPIC = "ABC";

    std::string transport("tcp://xxx.xxx.xxx.xx:5556");
    zmq::context_t context_t(1); // -? What is context
    zmq::socket_t subscriber(context_t, ZMQ_SUB);
    subscriber.connect(transport);
    subscriber.setsockopt(ZMQ_SUBSCRIBE, TOPIC.c_str(), TOPIC.length());

    zmq::pollitem_t items[] = {
        {zmq_socket, 0, ZMQ_POLLIN, 0},

    };
    while (true)
    {

        int rc = 0;
        zmq::message_t rx_msg;
        zmq::message_t topic;
        zmq::poll(&items[0], 1, -1);

        if (items[0].revents & ZMQ_POLLIN)
        {
            rc = subscriber.recv(&topic, ZMQ_RCVMORE);
            rc = subscriber.recv(&rx_msg) && rc;

            std::string rx_str;
            std::string rx_topic;

            rx_topic.assign(static_cast<char *>(topic.data()), topic.size());
            rx_str.assign(static_cast<char *>(rx_msg.data()), rx_msg.size());
            if (rc > 0)
            {
                std::cout << "Topic: " << rx_topic << std::endl;
                std::cout << "Received: " << rx_str << std::endl;
            }
        }
    }
}

int main()
{
    std::thread t_pub(sub);
    t_pub.join();
    return 0;
}

这段代码看起来很奇怪,为什么要将 ZMQ_RCVMORE 标志传递给 recv?

            rc = subscriber.recv(&topic, ZMQ_RCVMORE);
            rc = subscriber.recv(&rx_msg) && rc;

您应该使用 ZMQ_RCVMORE 来检查在第一次这样(或类似)recv 之后是否有更多消息

    int more;
    size_t more_len = sizeof(more);
    data_socket->getsockopt(ZMQ_RCVMORE, &more, &more_len);

如果您只是将代码更改为此会发生什么?

            subscriber.recv(&topic);
            subscriber.recv(&rx_msg);

您可能会通过将错误标志传递给 recv 来打乱订单流程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM