51 lines
1.1 KiB
C++
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;
|
|
});
|
|
}
|