将 Boost Asio 与 ZeroMQ、错误的文件描述符集成?

Integrating Boost Asio with ZeroMQ, Bad File Descriptor?

我正在尝试将 Boost Asio 与 ZeroMQ 集成。消息传递对第一次连接有效,但程序退出并出现错误 "Bad File Descriptor" 当初始连接结束时。

我正在使用 Async Websocket Server 的 Boost.Beast 示例代码与客户端建立连接。然后我打开一个 ZMQ 套接字。客户端通过 Websocket 连接向服务器发送消息,消息通过 ZMQ 套接字发送到不同的服务器,服务器将进行一些处理,服务器通过 ZMQ 发送回消息,最终消息发送回客户端通过相同的 Websocket 连接。

我正在使用 This Code 将 Boost 与 ZMQ 集成。重要线是

int zfd;
optlen = sizeof (zfd);
zmq_getsockopt (zmq_sock_, ZMQ_FD, &zfd, &optlen);
sock_.assign (boost::asio::ip::tcp::v4(), zfd);

这从 ZMQ 套接字获取文件描述符并用 Boost 套接字包装它,这样一切都很好。但是,当调用析构函数时:

sock_.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
sock_.close();
zmq_close (zmq_sock_);  

我得到一个错误,有一个Socket operation on a Non-socket,因为套接字似乎已关闭。如果我删除套接字关闭并关闭,我会遇到 ZMQ 的 Bad File Descriptor 问题。似乎 Session Websocket 对象正在部分破坏 Asio-ZMQ 对象。如果我完全删除析构函数,程序不会崩溃,但它不能再正常工作了。即它不会再通过 ZMQ 发送任何消息。

几天来我一直在为这个问题苦苦挣扎,希望能得到一些帮助。如果有帮助,我的代码采用 my_zmq_req_client class 并将其集成到 Boost.Beast session class.

我没看过链接库,但是这个片段

sock_.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
sock_.close();
zmq_close (zmq_sock_);  

看起来很可疑,因为 sock_.close() 正在干预一个没有被它打开的套接字。我建议 release asio 端的套接字比关闭它更有意义,这样 ZMQ 就可以继续对 creation/destruction.

负责
sock_.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
sock_.release();
zmq_close (zmq_sock_);