将ZeroMQ与Boost :: ASIO一起使用

Chr*_*ris 24 c++ sockets boost boost-asio zeromq

我有一个使用ZeroMQ进行消息传递的C++应用程序.但它还必须为基于AJAX/Comet的Web服务提供SGCI连接.

为此,我需要一个普通的TCP套接字.我可以通过普通的Posix套接字做到这一点,但是要保持跨平台的便携性并让我的生活更轻松(我希望...)我正在考虑使用Boost :: ASIO.

但现在我有ZMQ的冲突想要使用它自己zmq_poll()和ASIO它io_service.run()...

有没有办法让ASIO与0MQ一起工作zmq_poll()

或者是否有其他推荐的方法来实现这样的设置?

注:我可以解决,通过使用多线程 - 但它是将与SCGI交通非常低量运行该程序只有一点点的单核/ CPU中,所以多线程是一种资源的浪费?

Sam*_*ler 15

这里这里阅读文档后,特别是本段

ZMQ_FD:检索与套接字关联的文件描述符ZMQ_FD选项应检索与指定套接字关联的文件描述符.返回的文件描述符可用于将套接字集成到现有的事件循环中; ØMQ库应通过使文件描述符准备好进行读取,以边沿触发的方式发送套接字上的任何挂起事件.

我认为你可以使用null_buffers每一个zmq_pollitem_t并将事件循环推迟到io_service完全绕过它zmq_poll().然而,在上述文件中似乎有一些警告,特别是

从返回的文件描述符中读取的能力并不一定表明消息可以从底层套接字读取或写入; 应用程序必须检索实际的事件状态,然后检索ZMQ_EVENTS选项.

因此,当你的某个zmq套接字的处理程序被触发时,你必须在处理我认为的事件之前做更多的工作.未编译的伪代码如下

const int fd = getZmqDescriptorSomehow();
boost::asio::posix::stream_descriptor socket( _io_service, fd );
socket->async_read_some(
    boost::asio::null_buffers(),
    [=](const boost::system::error_code& error)
    {
       if (!error) {
           // handle data ready to be read
       }
     }
);
Run Code Online (Sandbox Code Playgroud)

注意你不必在这里使用lambda,boost::bind对一个成员函数就足够了.