嗨,我编写了一个使用异步套接字函数的简单应用程序。我在关闭套接字时遇到了一些问题。
async_connect
在调用套接字之前,我正在使用 5 秒计时器。在某些情况下,连接没有发生并且计时器到期。当计时器到期时,我正在关闭套接字tcp_socket.close()
。boost::asio::error::operation_aborted
但问题是当我尝试取消而不是关闭时,我的连接回调处理程序根本没有调用错误。接下来所有异步连接调用都会发生同样的事情。
尽管我正在关闭 tcp 套接字并销毁创建线程上的 client_session 对象 join() 调用没有出现意味着 io_service::run() 仍在运行而不退出......:-( 我不知道这是为什么发生...尝试了很多其他方法仍然面临同样的问题。
我没有得到什么问题,所有的建议和解决方案将不胜感激。
我的真实代码看起来像这样。
class client_session
{
public:
client_session(boost::asio::io_service& io_service_ )tcp_socekt_(io_service_),
timer_(io_service_)
{
}
~client_session()
{
tcp_socket_.close();
}
void OnTimerExpired(const boost::system::error_code& err)
{
if( err ) tcp_socket_.close();
}
//Its just for example this will be called from upper layer of my module. giving some information about the server.
void connect()
{
//Here am starting the timer
timer_.expires_from_now(boost::posix_time::seconds(2));
timer_.async_wait(boost::bind(&OutgoingSession::OnTimerExpiry, this,PLACEHLDRS::error));
.......
tcp_socket_.async_connect(iterator->endpoint(), boost::bind( &OutgoingSession::handle_connect, this, _1, iterator));
......
}
void OnConnect(const boost::system::error_code& err)
{
//Cancelling the timer
timer_.cancel();
.....
//Register for write to send the request to server
......
}
private:
tcp::socket tcp_socket_;
deadline_timer timer_;
}
void main()
{
boost::asio::io_service tcp_io_service;
boost::asio::io_service::work tcp_work(tcp_io_service);
boost::thread* worker = new boost::thread(&boost::asio::io_service::run,&tcp_io_service);
client_session* csession = new client_session(tcp_io_service);
csession->connect();
sleep(10);
tcp_io_service.stop();
delete csession;
worker.join(); //Here it not coming out of join because io_service::run() is not exited yet.
cout<<"Termination successfull"<<endl;
}