ZeroMQ:如何将Poller中使用的pollitem_t项目转换回ZeroMQ套接字?

问题描述 投票:1回答:1

正如标题所述,将zmq::pollcppzmq一起使用时,我希望避免将ZeroMQ套接字的转换硬编码为pollitem_t item(s)以进行轮询。

但是似乎不允许将void* pollitem_t::socket转换回zmq套接字。

我注意到官方示例代码在轮询后才对套接字进行了硬编码。

//
//  Reading from multiple sockets in C++
//  This version uses zmq_poll()
//
// Olivier Chamoux <[email protected]>

#include "zhelpers.hpp"

int main (int argc, char *argv[])
{
    zmq::context_t context(1);

    //  Connect to task ventilator
    zmq::socket_t receiver(context, ZMQ_PULL);
    receiver.connect("tcp://localhost:5557");

    //  Connect to weather server
    zmq::socket_t subscriber(context, ZMQ_SUB);
    subscriber.connect("tcp://localhost:5556");
    subscriber.setsockopt(ZMQ_SUBSCRIBE, "10001 ", 6);

    //  Initialize poll set
    zmq::pollitem_t items [] = {
        { static_cast<void*>(receiver), 0, ZMQ_POLLIN, 0 },
        { static_cast<void*>(subscriber), 0, ZMQ_POLLIN, 0 }
    };
    //  Process messages from both sockets
    while (1) {
        zmq::message_t message;
        zmq::poll (&items [0], 2, -1);

        if (items [0].revents & ZMQ_POLLIN) {
            receiver.recv(&message);
            //  Process task
        }
        if (items [1].revents & ZMQ_POLLIN) {
            subscriber.recv(&message);
            //  Process weather update
        }
    }
    return 0;
}

因此提出问题:

在这种情况下是否避免避免对套接字进行硬编码?

c++ sockets zeromq
1个回答
0
投票

Q在这种情况下是否不可能避免硬编码套接字?

这是为什么的一部分

[1]记录在[[Poller设置中的API要求我们将pollitem_t item强制填写到Poller -instance是必需的数据结构中。期待收到我们的来信。 (因此,这部分是必不可少的部分,其中有无法想象“避免”的技巧在这里-不透明[void*必须传递到Poller,以便按预期工作……实际上是.poll()某件事...)

[2]一种“反向”转码(是否经过硬编码)不是必需

(因此这里没有什么要避免的),正好是第一步-您的代码已经知道“地图”,它已经生成了pollitem_t item的1:1地图,用于强制交付给正在审核的Poller
EPILOGUE:

对于Socket实例的

amount的情况,恰好是强制(即,不可避免的)

的初始构建的主题) 1 :1-map-of- pollitem_t item的数据结构(您开始称之为“硬编码”部分),可以为静态情况(对于已知的Socket -instance是已处理)或自适应地图生成器,它将消耗您自己的托管导频“磁带”(系统维护的数据结构)以及要处理的所有Socket实例。]
© www.soinside.com 2019 - 2024. All rights reserved.