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()
{//読み取り操作の期限を設定します。deadline_.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を再度コールバックするのはなぜですか?

そうでない場合、クライアントはソケットを1回だけ読み取り、その後は二度と読み取りません。したがって、読み取りが成功すると、クライアントは読み取りを再試行する必要があります。これにより、ソケットを永続的に読み取ることができます。

タイマーが切れるとどうなりますか?タイマーにコールバックルーチンが提供されていません。

コードはソースファイルの先頭にあります。

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

期限が過ぎると、check_deadline()関数はソケットを閉じます。

于 2012-05-01T17:38:55.060 に答える