【发布时间】:2014-08-05 08:03:39
【问题描述】:
我正试图取消一个 TCP 接受器,但程序一直在该行阻塞。
一个线程等待这样的连接:
boost::system::error_code ec;
acceptor_ = new boost::asio::ip::tcp::acceptor(io_service_, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port));
acceptor_->accept(socket_, ec); // socket_ is a boost::asio::ip::tcp:socket
必须关闭接受器的线程:
boost::system::error_code ec;
acceptor_->close(ec);
我有什么遗漏吗?我没有使用任何异步操作,所以我可以对 io_service 对象做点什么吗?
【问题讨论】:
-
您可以在关闭它之前尝试使用
acceptor_->cancel();。我在我的程序中使用它,它工作正常。但是我认为close()也应该可以工作。你确定你在处理同一个接受器对象吗? -
是的,当然是同一个接受者。我的代码可以在 Windows 上运行,但不能在 Linux 上运行,有什么想法吗?
-
close()阻塞时的堆栈跟踪是什么?为什么要取消 another thread? -
为什么不能从另一个线程取消接受者?我的意思是,如果接受是一个阻塞操作,我如何从同一个线程中取消它?
标签: c++ sockets boost tcp boost-asio