1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| class tcp_connection : public boost::enable_shared_from_this<tcp_connection>
{
public:
typedef boost::shared_ptr<tcp_connection> pointer;
static pointer create(boost::asio::io_service& ios)
{
return pointer(new tcp_connection(ios));
}
tcp::socket& socket()
{
return m_socket;
}
void do_read() // (1)
{
// On lance une écoute
boost::asio::async_read(m_socket, boost::asio::buffer(m_buffer), // (3)
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error)
);
timer.expires_from_now(boost::posix_time::seconds(5)); // (4)
timer.async_wait(boost::bind(&tcp_connection::close, shared_from_this() )); //(5)
}
void start()
{
m_message = "Bienvenue sur le serveur!";
boost::asio::async_write(m_socket, boost::asio::buffer(m_message),
boost::bind(&tcp_connection::handle_write, shared_from_this(),
boost::asio::placeholders::error)
);
}
private:
tcp_connection(boost::asio::io_service& io_service)
: m_socket(io_service),
timer(io_service, boost::posix_time::seconds(5)) // Commence à compter dès sa création
{
}
void handle_write(const boost::system::error_code& error)
{
if (!error)
{
do_read(); // (2)
}
else {
std::cout << error.message() << std::endl;
}
}
void handle_read(const boost::system::error_code& error) // (6)
{
if (!error)
{
// On réécoute
do_read();
}
else
{
close();
}
}
void close() // (7)
{
m_socket.close();
}
boost::asio::deadline_timer timer;
tcp::socket m_socket;
std::string m_message;
boost::array<char, 128> m_buffer;
}; |
Partager