Boost 1.47.0 только что ввел функцию тайм-аута для basic_socket_iostream
, а именно методов expires_at
и expires_from_now
.
Вот пример, основанный на вашем фрагменте:
#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;
}
}
Эта программа работает для меня в Linux.
Обратите внимание, что я не рекомендую использовать тайм-ауты вместо асинхронной операции с таймером дедлайна.Тебе решать.Я просто хотел показать, что таймауты возможны с basic_socket_iostream
.