ASIO io_service运行多次的问题

Issue with ASIO io_service to run multiple time

本文关键字:问题 运行 io service ASIO      更新时间:2023-10-16

在我的问题。我是一个客户,我的目的只是在需要的时候在服务器上写东西,而不是每次都写。

我有一个单例类(Caller类),我调用我的客户端程序(client)在服务器上写任何消息然后调用boost::asio::io_service::通过一个线程运行。我的客户端程序(client)也是单例类。

如果服务器已经运行,我的程序可以正常工作。因为客户端将在第一个实例中连接到服务器。但是,如果服务器重新启动或不运行,那么首先我必须检查服务器是否在写消息之前运行。

每次检查服务器是否可用,我必须调用Caller::run()并运行io_service。

如果没有运行io_service,我无法检查服务器是否正在运行,因为我在程序中使用所有同步。一切都是async (asyncn connect, sync write)

我的问题是,有时我的程序去+D1状态(不间断睡眠),然后我无法关闭我的程序。这是由于io_service()吗?

如果不运行io_service,如何检查服务器是否打开?

 class Caller
 {
  public:
  static Caller* getInstance()
  {
   static Caller Caller;
   return &Caller;
  }
  void run() 
  {
    pWork.reset( new boost::asio::io_service::work(io_service) );
    ////////////calling client program//////////////// 
    Client::getInstance(io_service)->start();
    thread = boost::thread(boost::bind(&boost::asio::io_service::run, &io_service));
  }     
  boost::asio::io_service io_service;
  boost::shared_ptr<boost::asio::io_service::work> pWork;
  boost::thread thread;
 private:
  Caller()
  {
  }
  ~Caller()
  {
    pWork.reset();
    thread.join();
  }
}; 

///////////my client program (Singleton Class)//////////////////
//////message write function///////////
void Client::sendResponse(std::string& messag)                      
{                                                                              
  boost::system::error_code error;                                           
  boost::asio::ip::tcp::endpoint endpoint = socket().remote_endpoint(error);    
  if ( error ) 
  {                                                               
    DEBUG_2("could not write: ",boost::system::system_error(error).what());    
    this->stop(); /////this will close the socket////
    Caller::getInstance()->run();   
    //////it will call the caller program to call the  connect function of client program /////
  }                                                                           
  else
    boost::asio::async_write(                                                         
      _socket,                                                                      
      boost::asio::buffer( message.c_str(), message.size()),
      _strand.wrap(                                                                 
        boost::bind(                                                                
          &Client::writeHandler,                                             
          this,
          boost::asio::placeholders::error,                                         
          boost::asio::placeholders::bytes_transferred  
}                                                                              

 Client *Client::getInstance(boost::asio::io_service& io_service)
  {
    if (!Client)
    {
      Client = new Client(io_service);
    }
    return Client;
  } 

我可以这样设计,我只写到服务器,而不需要一次又一次地运行io_service。或者我需要调用io_service::reset()我是否以正确的方式使用工作?

我怎样才能优雅地停止或中止这个进程?通过调用io_servie::stop或者加入这个线程?

检测连接有效性的典型方法是在连接成功后执行async_read()。当async_read()回调指示boost::asio::error::eof错误时,您的应用程序应该做出适当的反应:

  1. 重新连接,可能有超时延迟
  2. 终止优雅

听起来你需要选项1。如果编写正确,您的应用程序应该只需要调用io_service::run()一次,事件循环将不断有工作要做。


如果你不想从套接字中读取来检测闭包,实例化一个work对象,并在程序运行期间将其保持在作用域中。这将确保io_service总是有工作要做。当您的async_write完成处理程序被调用并出现错误时,请按照前面的建议对您的应用程序做出必要的反应。