1

我正在查看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. 计时器到期时会发生什么?我没有看到提供给计时器的回调例程。

void start_read()
{ // 设置读取操作的截止日期。截止日期_.expires_from_now(boost::posix_time::seconds(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_) return;

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();
}   

}

4

1 回答 1

2

为什么handle_read会再次回调start_read?

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

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

代码位于源文件的顶部:

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

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

于 2012-05-01T17:38:55.060 回答