#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 секунды?