From reading other Stack Overflow entries and the boost::asio
documentation, I've confirmed that there is no synchronous ASIO read/write calls that also provide an easy-to-use timeout as a parameter to the call.
I'm in the middle of converting an old-school Linux socket application with select(2) calls that employs timeouts, and I need to do more-or-less the same.
So what is the best way to do this in boost::asio
? Looking at the asio documentation, there are many confusing examples of various things to do with timers, but I'm quite confused.
I'd love to see a simple-to-read example of this: Read from a socket, but wait for a maximum of X seconds after which the function either returns with nothing, or returns with whatever it was able to read from the socket before the timeout expired.
This has been brought up on the asio mailing lists, there's a ticket requesting the feature as well. To summarize, it is suggested to use asynchronous methods if you desire timeouts and cancellability.
If you cannot convert to asynchronous methods, you might try the
SO_RCVTIMEO
andSO_SNDTIMEO
socket options. They can be set withsetsockopt
, the descriptor can be obtained with the boost::asio::ip::tcp::socket::native method. Theman 7 socket
man page saysI used some asio docs to produce this:
Usage:
I debugged it, and it appears to do what it is supposed to.