Сокет Boost :: asio - как сделать read_some 'throw' в "timeout"? - PullRequest
4 голосов
/ 04 ноября 2011

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

1 Ответ

3 голосов
/ 04 ноября 2011

Вам следует рассмотреть возможность использования 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 wait\n";
timer.async_wait(&handle_timeout);
io_service.run();

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

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

...