Boost 1.47.0 has just implemented a timeout function for basic_socket_iostream , namely the expires_at and expires_from_now .
Here is an example based on your snippet:
#include <iostream> #include <boost/asio.hpp> using namespace boost::asio::ip; using namespace std; int main(){ int m_nPort = 12345; boost::asio::io_service io_service; tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), m_nPort)); cout << "Waiting for connection..." << endl; tcp::iostream stream; acceptor.accept(*stream.rdbuf()); cout << "Connection accepted" << endl; try { stream << "Start sending me data\r\n"; // Set timeout in 5 seconds from now stream.expires_from_now(boost::posix_time::seconds(5)); // Try to read 12 bytes before timeout char buffer[12]; stream.read(buffer, 12); // Print buffer if fully received if (stream) // false if read timed out or other error { cout.write(buffer, 12); cout << endl; } } catch(exception &e) { cerr << e.what() << endl; } }
This program works for me on Linux.
Please note that I am not a supporter of the fact that you use timeouts instead of an asynchronous operation with a timer timer. It is up to you. I just wanted to show that timeouts are possible with basic_socket_iostream .
source share