Boost :: asio сокет — как заставить read_some «выбрасывать» в «тайм-аут»?

#c #sockets #boost #timeout #boost-asio

#c #сокеты #boost #тайм-аут #boost-asio

Вопрос:

Итак, обычно мы делаем что-то подобное socket.read_some(boost::asio::buffer(buffer, buffer_size)); , но как заставить его выдать исключение, если чтение не началось в течение некоторого времени дольше, чем, скажем, 333 секунды?

Комментарии:

1. 666 — число зверя. 668, его сосед.

Ответ №1:

Вам следует рассмотреть возможность использования async_read_some вместо read_some , поскольку это позволяет запускать новый фоновый таймер одновременно с чтением. Затем, чтобы создать новый таймер для каждого нового сокета, который вы делаете:

 boost::asio::io_service io_service;

time_t_timer timer(io_service);

timer.expires_from_now(333);
std::cout << "Starting asynchronous waitn";
timer.async_wait(amp;handle_timeout);
io_service.run();
  

У вас будет два асинхронных вызова, ожидающих в фоновом режиме.

Всякий раз, когда вы получаете какие-либо данные по таймеру, вы можете сбросить обратный отсчет, используя cancel и expires_from_now , а по истечении таймера вы можете закрыть сокет или выполнить какое-либо другое действие.

Комментарии:

1. А что, если я получаю его дольше, чем 333 секунды?