将Boost Asio与ZeroMQ,Bad File Descriptor集成在一起?

时间:2018-02-05 18:18:15

标签: c++ boost-asio zeromq

我正在尝试将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类中。

1 个答案:

答案 0 :(得分:3)

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

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

看起来很可疑,因为sock_.close()干扰了一个未被它打开的套接字。我建议对asio端的release套接字更有意义,而不是关闭它,以便ZMQ可以继续对创建/销毁负责。

sock_.shutdown(boost::asio::ip::tcp::socket::shutdown_both);
sock_.release();
zmq_close (zmq_sock_);  
相关问题