|
Boost : |
From: Christopher Kohlhoff (chris_at_[hidden])
Date: 2007-04-26 09:18:31
On Tue, 24 Apr 2007 23:44:35 -0700, "Dean Michael Berris"
<mikhailberis_at_[hidden]> 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
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk