正如标题所述,将zmq::poll
与cppzmq
一起使用时,我希望避免将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;
}
在这种情况下是否避免避免对套接字进行硬编码?
Q:在这种情况下是否不可能避免硬编码套接字?
是
[1]记录在[[Poller
设置中的API要求我们将pollitem_t item
强制填写到Poller
-instance是必需的数据结构中。期待收到我们的来信。 (因此,这部分是必不可少的部分,其中有无法想象“避免”的技巧在这里-不透明[void*
必须传递到Poller
,以便按预期工作……实际上是.poll()
某件事...)
[2]一种“反向”转码(是否经过硬编码)不是必需
(因此这里没有什么要避免的),正好是第一步-您的代码已经知道“地图”,它已经生成了pollitem_t item
的1:1地图,用于强制交付给正在审核的Poller
。Socket
实例的amount的情况,恰好是强制(即,不可避免的)
的初始构建的主题) 1 :1-map-of-pollitem_t item
的数据结构(您开始称之为“硬编码”部分),可以为静态情况(对于已知的Socket
-instance是已处理)或自适应地图生成器,它将消耗您自己的托管导频“磁带”(系统维护的数据结构)以及要处理的所有Socket
实例。]