Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 调用boost::asio::io_service::run()时,boost::asio::io_serive::stop()未退出_Sockets_Tcp_Boost Asio_Cancellation - Fatal编程技术网

Sockets 调用boost::asio::io_service::run()时,boost::asio::io_serive::stop()未退出

Sockets 调用boost::asio::io_service::run()时,boost::asio::io_serive::stop()未退出,sockets,tcp,boost-asio,cancellation,Sockets,Tcp,Boost Asio,Cancellation,您好,我已经编写了一个使用异步套接字函数的简单应用程序。我在关闭插座时遇到一些问题 在调用套接字上的async\u connect之前,我使用了5秒计时器。在某些情况下,连接没有发生,计时器过期。计时器过期时,我正在关闭套接字tcp\u socket.close()。但问题是,当我试图取消而不是关闭连接时,我的连接回调处理程序根本没有被调用,而是出现了boost::asio::error::operation\u aborted错误。异步连接调用的下一次调用也会发生同样的情况 即使我关闭tcp套

您好,我已经编写了一个使用异步套接字函数的简单应用程序。我在关闭插座时遇到一些问题

在调用套接字上的
async\u connect
之前,我使用了5秒计时器。在某些情况下,连接没有发生,计时器过期。计时器过期时,我正在关闭套接字
tcp\u socket.close()
。但问题是,当我试图取消而不是关闭连接时,我的连接回调处理程序根本没有被调用,而是出现了
boost::asio::error::operation\u aborted
错误。异步连接调用的下一次调用也会发生同样的情况

即使我关闭tcp套接字并销毁已创建线程上的客户端会话对象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;
}
类客户端会话
{ 
公众:
客户端会话(boost::asio::io_服务和io_服务)tcp_socekt_(io_服务),
定时器(io\U服务)
{
}
~client_session()
{
tcp_套接字_u.close();
}
void OnTimerExpired(const boost::system::error\u code&err)
{
如果(错误)tcp_套接字_u.close();
}
//例如,这将从我的模块的上层调用。提供一些关于服务器的信息。
void connect()
{
//我开始计时了
计时器从现在起过期(boost::posix_time::seconds(2));
计时器异步等待(boost::bind(&OutgoingSession::OnTimerExpiry,this,PLACEHLDRS::error));
.......
tcp_socket_.async_connect(迭代器->端点(),boost::bind(&OutgoingSession::handle_connect,this,_1,迭代器));
......
}
void OnConnect(const boost::system::error\u code&err)
{
//取消计时器
计时器u0.cancel();
.....
//注册写入以将请求发送到服务器
......
}
私人:
tcp::socket tcp\u socket\u;
截止时间(计时器);;
} 
void main()
{
boost::asio::io_服务tcp_io_服务;
boost::asio::io_服务::工作tcp_工作(tcp_io_服务);
boost::thread*worker=newboost::thread(&boost::asio::io\u服务::run,&tcp\u io\u服务);
client_session*csession=新的client_session(tcp_io_服务);
csession->connect();
睡眠(10);
tcp_io_服务.stop();
删除会话;
worker.join();//由于io_service::run()尚未退出,因此它不会从join中退出。

cout发布的代码似乎有两个不同的错误。我建议从较小的步骤开始,即沿着

  • 干净地启动
    和停止
asio工作线程(参见下面的说明)
  • 向启动计时器添加代码:正确处理
    OnTimerExpired
    ,检查错误代码
  • async\u connect
    的加载项代码:调用连接处理程序时,
    取消
    计时器并检查错误代码
  • 添加其他异步操作等
  • 例如,当您
    取消
    连接处理程序中的计时器时,
    OnTimerExpired
    处理程序将被调用
    boost::asio::operation\u中止
    ,然后您
    关闭
    套接字,这可能不是您想要做的


    此外,您给了
    io_服务
    工作,但仍然调用了
    stop
    。通常,如果给了io_服务工作,您希望通过删除工作来停止执行线程(例如,这可以通过将工作存储在智能指针中并重置它来实现)并让当前启动的异步操作干净地完成。

    我建议发布一些代码。谢谢拉尔夫…我在其他地方收到了问题。但您在上述帖子中提供的信息对我非常有用…再次感谢。。。