aio/echo_server.cpp Source File
#include <booster/shared_ptr.h>
#include <booster/enable_shared_from_this.h>
#include <booster/aio/io_service.h>
#include <booster/aio/buffer.h>
#include <booster/aio/endpoint.h>
#include <booster/aio/acceptor.h>
#include <booster/aio/stream_socket.h>
#include <iostream>
#include <functional>
class echo_session : public booster::enable_shared_from_this<echo_session> {
public:
echo_session(booster::aio::io_service &s) : socket_(s)
{
}
void run()
{
socket_.async_read_some(
booster::aio::buffer(buffer_,sizeof(buffer_)),
std::bind(&echo_session::on_read,shared_from_this(),
std::placeholders::_1,
std::placeholders::_2));
}
void on_read(booster::system::error_code const &e,size_t tr)
{
if(e) return;
socket_.async_write(booster::aio::buffer(buffer_,tr),
std::bind(&echo_session::on_written,shared_from_this(),std::placeholders::_1));
}
void on_written(booster::system::error_code const &e)
{
if(e) return;
run();
}
private:
friend class echo_acceptor;
char buffer_[1024];
booster::aio::stream_socket socket_;
};
class echo_acceptor {
public:
echo_acceptor(booster::aio::io_service &srv) : acceptor_(srv)
{
booster::aio::endpoint ep("0.0.0.0",8080);
acceptor_.open(ep.family());
acceptor_.set_option(booster::aio::acceptor::reuse_address,true);
acceptor_.bind(ep);
acceptor_.listen(10);
}
void run()
{
new_session_.reset(new echo_session(acceptor_.get_io_service()));
acceptor_.async_accept(new_session_->socket_,
std::bind(&echo_acceptor::on_accepted,this,std::placeholders::_1));
}
void on_accepted(booster::system::error_code const &e)
{
if(e) {
std::cout << e.message() << std::endl;
run();
}
else {
new_session_->run();
run();
}
}
private:
booster::aio::acceptor acceptor_;
booster::shared_ptr<echo_session> new_session_;
};
int main()
{
try {
booster::aio::io_service srv;
#if !defined(_WIN32) && !defined(__CYGWIN__)
booster::aio::basic_io_device stdin_device(srv);
stdin_device.attach(0);
std::cout << "Press any key to stop" << std::endl;
stdin_device.on_readable(std::bind(&booster::aio::io_service::stop,&srv));
#endif
echo_acceptor acc(srv);
acc.run();
srv.run();
}
catch(std::exception const &e) {
std::cerr<<e.what()<<std::endl;
}
}
// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4