截止日期计时器到期,现在是什么?

时间:2012-05-01 17:30:49

标签: c++ boost-asio

我正在查看http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/example/timeouts/async_tcp_client.cpp

中的asio示例

以下是我真正难以理解的内容:

  1. 为什么handle_read再次回调start_read?
  2. 计时器到期后会发生什么?我看到没有为计时器提供回调例程。
  3.   

    void start_read()
        {       //设置读取操作的截止日期。       deadline_.expires_from_now(升压::了posix_time ::秒(30));

    // Start an asynchronous operation to read a newline-delimited message.
    boost::asio::async_read_until(socket_, input_buffer_, '\n',
        boost::bind(&client::handle_read, this, _1));   
    
         

    }

         

    void handle_read(const boost :: system :: error_code& ec)
        {       if(stopped_)         返回;

    if (!ec)
    {
      // Extract the newline-delimited message from the buffer.
      std::string line;
      std::istream is(&input_buffer_);
      std::getline(is, line);
    
      // Empty messages are heartbeats and so ignored.
      if (!line.empty())
      {
        std::cout << "Received: " << line << "\n";
      }
    
      start_read();
    }
    else
    {
      std::cout << "Error on receive: " << ec.message() << "\n";
    
      stop();
    }   
    
         

    }

1 个答案:

答案 0 :(得分:2)

  

为什么handle_read会再次回调start_read?

如果没有,客户端只会读取一次套接字,然后再也不会。因此,在成功读取时,客户端想要再次尝试读取。这使得永久读取套接字。

  

计时器到期后会发生什么?我看到没有为计时器提供回调例程。

代码位于源文件的顶部:

deadline_.async_wait(boost::bind(&client::check_deadline, this));

如果截止日期已过,check_deadline()函数将关闭套接字。