【发布时间】:2019-11-01 17:33:24
【问题描述】:
正如标题所说,当使用 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 <olivier.chamoux@fr.thalesgroup.com>
#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;
}
因此问题:
在这种情况下是否无法避免硬编码套接字?
【问题讨论】:
-
您是如何尝试将
items[0].socket转换回zmq::socket_t的? -
zmq::socket_t sock = static_cast<zmq::socket_t>(pollitem.socket);this 或zmq::socket_t* sock = static_cast<zmq::socket_t*>(pollitem.socket); -
查看 zmq 源代码,我注意到只有这个演员表:
zmq::socket_base_t *s = static_cast<zmq::socket_base_t *> (s_);其中s_是void*。 -
是的,
zmq::socket_t有一个返回句柄的operator void*,但是没有办法返回到套接字。 -
@Botje 真可惜。当从多个套接字轮询时,我真的很想使用像 std::map 这样的容器在接收到的消息和套接字之间进行一对一的映射。但是这种民意调查使它很难实现。我唯一能想到的就是创建另一个已知套接字引用的容器,并手动将其与轮询项同步。哦,好吧。