ZeroMQ :如何将 Poller 中使用的pollitem_t项投射回 ZeroMQ 套接字?
ZeroMQ: How to cast a pollitem_t item, used in Poller, back to a ZeroMQ socket?
正如标题所说,当将zmq::poll
与cppzmq
一起使用时,我很想避免将ZeroMQ套接字的转换硬编码为pollitem_t item
进行轮询。
但似乎不允许我将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;
}
因此问题来了:
在这种情况下,是否不可能避免硬编码套接字?
从 zmq.hpp 标头一起解决这个问题:
zmq::poller_t poller;
poller.add({from_handle, receiver.handle()}, event_flags::pollin});
poller.add({from_handle, subscriber.handle()}, event_flags::pollin});
// This vector must be at least as large as the number of sockets being polled
vector<zmq::poller_event> events(2);
while (true) {
size_t num_events = poller.wait_all(events, -1);
// You may need to sleep a bit if num_events == 0
for (int i = 0; i < num_events; i++) {
zmq::message message;
events[i].socket.recv(&message);
...
}
}
编辑:意识到poller_event
结构也包含一个socket_ref
!这让事情变得更加容易!
使用稳定的 zmq 版本,您需要#define ZMQ_BUILD_DRAFT_API
才能使用poller_t
及其包。
问:在这种情况下,是否不可能避免硬编码套接字?
是的。
这是为什么部分:
1 )记录Poller
- setup的API要求我们将pollitem_t item
填充到Poller
实例期望从我们这里收到的强制性数据结构中。(所以这部分是必备的,没有可以想象的 "避免"-这里可能存在的技巧-必须将不透明的void*
交付给Poller
才能按预期工作......确实.poll()
一些事情...
2 )"反向"转码(硬编码与否)
不是必需的(因此这里没有要避免的事情),由于步骤1 - 您的代码已经知道"映射" - 它已经生成了1:1映射pollitem_t item
(s)强制交付给正在审查Poller
。
结语:
对于Socket
实例的数量,恰好是强制性(即不可避免的)1:1-map-of-pollitem_t item
s数据结构(你开始称之为"硬编码"部分)的初始构建,可以设计一个脚本工具用于静态情况(对于已知Socket
实例的情况)或自适应映射生成器, 这将使用您自己的托管试点"磁带"(您系统维护的数据结构)以及要处理的所有Socket
实例)。
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- ZeroMQ :如何将 Poller 中使用的pollitem_t项投射回 ZeroMQ 套接字?
- 关于 ZeroMQ 和在非阻塞套接字上的轮询:.
- 在 ZeroMQ 中绑定订阅者套接字并连接发布者套接字会在代码运行时给出错误.为什么
- EAGAIN 在 zeromq REQ/REP 上收到,没有阻塞套接字
- ZeroMQ 在 context.close() 中被阻止.如何在C++中安全地关闭套接字和上下文?
- 每个线程或每个调用一个 ZeroMQ 套接字
- ZeroMQ是否允许多个服务器套接字
- C++ 具有 REQ 和 REP 套接字的 ZeroMQ 单一应用程序
- zeromq:重置REQ/REP套接字状态
- ZeroMQ-使用REQ套接字发送超过30个字节
- 通过ZeroMQ以字符串形式接收对象,然后通过另一个套接字以零拷贝发送对象的正确方法是什么
- 跟进:提升通过 ZeroMQ 拉套接字传递的序列化自定义C++对象
- ZeroMQ:重新绑定套接字时使用地址错误