在Using ZeroMQ with Boost::ASIO中,我一直在遵循关于在 POSIX-ish 平台 (MacOS) 上使用 0MQ 和 Boost.Asio 的出色建议。不过,不幸的是,我正在编写需要在 POSIX-ish 和 Windows 上运行的代码。到目前为止,我在尝试将此建议翻译到 Windows 方面时运气不佳。我似乎无法弄清楚如何匹配 Windows 上的 getsockopt(ZMQ_FD) 返回的类型以及我认为应该是 boost::asio::posix::stream_descriptor 的 Windows 等效项。这是我尝试过的:
zmq::context_t zenv(1);
zmq::socket_t zocket(zenv, ZMQ_PUSH);
SOCKET zfd;
std::size_t zfd_size = sizeof(zfd);
zocket.getsockopt(ZMQ_FD, &zfd, &zfd_size);
boost::asio::io_service ios;
boost::asio::windows::stream_handle io(ios, zfd);
当我尝试编译它时,我得到的错误。
2>Z:\zee-zmq-socket.cpp(14): error C2664: 'boost::asio::windows::basic_stream_handle<>::basic_stream_handle(boost::asio::io_service &,void *const &)' : cannot convert parameter 2 from 'SOCKET' to 'void *const &'
2> Reason: cannot convert from 'SOCKET' to 'void *const '
2> Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
到目前为止,我的 Google-fu 一直很弱;我似乎只能在 POSIX 上找到处理 Boost.Asio 和 0MQ 的示例。我不确定我需要做什么才能正确地从 SOCKET 到void * const
. 我能找到的最接近的建议是关于结合 0MQ 和 libcurl:http ://comments.gmane.org/gmane.comp.lib.boost.asio.user/5071 。这个建议也让我感到紧张,因为我的编译问题只是隐藏在表面下的更恶劣的冰山一角。尤其是,
boost::asio::ip::tcp::sockets 有分配但没有释放功能的原因是,一旦套接字“绑定”到完成端口,您就不能“解除绑定”或“绑定”它到另一个完成端口。
所以我担心可能还有其他一些我可能不知道的问题,甚至不会礼貌地表现为编译时错误。预先感谢您的任何帮助。