cpputil/test/server/server.cpp

51 lines
1.1 KiB
C++

#include "server.h"
#include <boost/asio/spawn.hpp>
server::server(std::string address, std::string port)
{
tcp::resolver resolver(_io_service);
tcp::resolver::query query(address, port);
_acceptor = new tcp::acceptor(_io_service, *resolver.resolve(query));
}
void server::run()
{
boost::asio::spawn(_io_service, [&](boost::asio::yield_context yield) {
try
{
for (;;)
{
session *s = new session(_io_service, &_pool);
_acceptor->async_accept(s->socket(), yield);
_sessions.insert(s);
s->start();
}
}
catch (boost::system::system_error& ex)
{
std::cout << "server exception: " << ex.what() << std::endl;
}
});
_io_service.run();
std::cout << "after ioservice run" << std::endl;
std::for_each(_sessions.begin(), _sessions.end(), [](session* s){ delete s; });
_sessions.clear();
}
server::~server()
{
std::cout << "server destructor" << std::endl;
delete _acceptor;
}
void server::stop()
{
_io_service.post([&]{
_acceptor->close();
std::for_each(_sessions.begin(), _sessions.end(), [](session* s){ s->stop(); });
_pool.wait_all();
std::cout << "stop exited" << std::endl;
});
}