2012-05-01 5 views
1

Я смотрю на ASIO, например, в http://www.boost.org/doc/libs/1_44_0/doc/html/boost_asio/example/timeouts/async_tcp_client.cppсрок действия таймера истекает, теперь что?

Вот что я имею реальные проблемы, чтобы понять:

  1. Почему handle_read перезвонить start_read снова?
  2. Что происходит, когда таймер истекает? Я не вижу никакой процедуры обратного вызова, предоставляемой таймеру.

аннулируются 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)); 

}

недействительным handle_read (Const подталкивание :: Система :: error_code & ек)
{ если (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(); 
} 

}

ответ

2

Почему handle_read перезвонить start_read снова?

Если это не так, клиент будет только читать сокет один раз, а затем никогда больше. Таким образом, при успешном чтении клиент хочет попытаться снова прочитать. Это обеспечивает постоянное считывание сокета.

Что происходит, когда таймер истекает? Я не вижу никакой процедуры обратного вызова, предоставляемой таймеру.

Код в верхней части исходного файла:

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

check_deadline() функция закрывает сокет, если срок прошел.

Смежные вопросы