截止日期计时器到期,现在怎么办?
Posted
技术标签:
【中文标题】截止日期计时器到期,现在怎么办?【英文标题】:deadline timer expires, now what? 【发布时间】:2012-05-01 17:30:49 【问题描述】:我正在看http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/example/timeouts/async_tcp_client.cpp中的asio示例
以下是我真正难以理解的内容:
-
为什么handle_read 再次回调start_read?
计时器到期后会发生什么?我没有看到提供给计时器的回调例程。
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 (!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】:为什么handle_read又回调start_read?
如果没有,客户端只会读取一次套接字,然后再也不读取。因此,在成功读取时,客户端想要再次尝试读取。这样可以永久读取套接字。
计时器到期时会发生什么?我没有看到提供给计时器的回调例程。
代码在源文件的顶部:
deadline_.async_wait(boost::bind(&client::check_deadline, this));
如果截止日期已过,check_deadline()
函数将关闭套接字。
【讨论】:
以上是关于截止日期计时器到期,现在怎么办?的主要内容,如果未能解决你的问题,请参考以下文章