Вам необходимо использовать цикл while для обработки всех обработчиков, которые выдают исключение, когда истек тайм-аут и данные не могут быть прочитаны в течение этого тайм-аута.
Ситуация, когда обработчик async_wait
выполняется до async_read
Обработчик означает, что сокет не может прочитать данные за 1 секунду.Обработчик
1. run_one is called
2. handler passed into async_wait is called
3. timer_result is set
4. else if (timer_result) is processed
5. sock.cancel() is called [ cancel() queues handler with error code !!
which indicates that read operation was aborted]
6. handler passed into async_read is queued
, переданный в async_read
, был поставлен в очередь, но когда он вызывается?Он может быть вызван только run_one
.Если этот обработчик не вызывается, read_result
не может быть установлен.Итак, как вы хотите сигнализировать ситуацию, когда данные не могут быть прочитаны в течение некоторого времени ожидания?read_result
можно установить только путем вызова обработчика внутри run_one
.Вот почему вам нужно обработать run_one
внутри цикла для вызова обработчика, который устанавливает необязательный read_result
с кодом ошибки, который указывает на прерванную операцию чтения.