
On Tue, 24 Apr 2007 23:44:35 -0700, "Dean Michael Berris" <mikhailberis@gmail.com> said: [...]
For a myriad of reasons, we're using blocking API calls (boost::asio::read_until and boost::asio::write) but these API calls don't seem to readily have a way of setting a timeout value -- one that says "try reading until either the response matches this... or throw an error after 1 second if you don't get a response from the server".
Would there be a different way of going about it, aside from using asynchronous operations?
No, async operations would be the way to go. Something like (warning, untested code): void set_result(optional<error_code>* a, error_code b) { a->reset(b); } template <typename MutableBufferSequence> void read_with_timeout(tcp::socket& sock, const MutableBufferSequence& buffers) { optional<error_code> timer_result; deadline_timer timer(sock.io_service()); timer.expires_from_now(seconds(1)); timer.async_wait(boost::bind(set_result, &timer_result, _1)); optional<error_code> read_result; async_read(sock, buffers, boost::bind(set_result, &read_result, _1)); sock.io_service().reset(); while (sock.io_service().run_one()) { if (read_result) timer.cancel(); else if (timer_result) sock.cancel(); } if (*read_result) throw system_error(*read_result); } Cheers, Chris