2017-01-06 35 views
2

我正在使用boost::asio将数据传输到&从客户端到服务器。我在客户端有读取器线程来读取客户端上的套接字上接收到的数据。请注意,我在服务器端的客户端& boost::asio::write上使用boost::asio::read。 不使用async_readasync_write。一切都很好。如何在等待时取消`boost :: asio :: read`操作

但是,当我关闭我的应用程序,2 10倍的应用程序不干净地拆卸或关闭正常。它在关闭时被挂起问题如下:

当我的应用关闭期间析构函数被调用时,我的关闭函数被调用。以下是关闭功能的代码:

socket.cancel(); 
socket.close(); 
boost::system::error_code ec; 
socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec); 

的问题是,boost::asio::read调用不返回时,它不会得到任何数据&一直等待就可以了。只要我可以取消它,这应该没问题。我正试图在其上执行socket.cancel以在退出时取消所有读取操作。 但是,它似乎并没有工作。我在一些论坛上读到socket.cancel只能取消async_read的操作。是这样吗 ? 那么当我的应用程序需要退出时,取消boost :: asio :: read`操作的方法是什么?

回答

2

这就是阻塞IO的本质。

事实上socket.cancel()(或者甚至是io_service::stop())将不能用于同步操作。

中断这个的唯一方法是使用套接字级超时(但Asio不公开)或使用异步信号(例如在终端中按Ctrl-C发送子进程SIGINT)。

我之前已经创建了,穷人的包装,如果你坚持一个超时运行单操作:

+0

好像我需要使用异步操作来解决此问题。托管此代码的我的C++正在基于UI的应用程序中使用,这在那里并不成问题,因为我认为发送'SIGINT'是为了在UI应用程序被终止时终止整个应用程序。当客户端应用程序是控制台应用程序时,这只是一个问题。无论如何,谢谢你的解释 –

相关问题