我正在查看http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/example/timeouts/async_tcp_client.cpp
中的asio示例以下是我真正难以理解的内容:
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(); }
}
答案 0 :(得分:2)
为什么handle_read会再次回调start_read?
如果没有,客户端只会读取一次套接字,然后再也不会。因此,在成功读取时,客户端想要再次尝试读取。这使得永久读取套接字。
计时器到期后会发生什么?我看到没有为计时器提供回调例程。
代码位于源文件的顶部:
deadline_.async_wait(boost::bind(&client::check_deadline, this));
如果截止日期已过,check_deadline()
函数将关闭套接字。