【发布时间】:2018-02-05 18:18:15
【问题描述】:
我正在尝试将 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 类并将其集成到 Boost.Beast session 类中。
【问题讨论】:
标签: c++ boost-asio zeromq