#include "session.h" #include #include #include session::session(boost::asio::io_service &io_service, threadpool* pool): _socket(io_service), _pool(pool) { } void session::start() { boost::asio::spawn(_socket.get_io_service(), [this](boost::asio::yield_context yield){ try { for (;;) { std::size_t bytes = _socket.async_read_some(boost::asio::buffer(_data, 128), yield); std::cout << "before async call" << std::endl; int n = async_call([this] { std::cout << "async call start waiting" << std::endl; std::this_thread::sleep_for(std::chrono::seconds(15)); std::cout << "async call ends waiting" << std::endl; int n = std::atoi(_data); return n * n; }, yield); std::cout << "before write: " << n << std::endl; _socket.async_write_some(boost::asio::buffer(std::to_string(n) + "\n"), yield); std::cout << "after write" << std::endl; } } catch (boost::system::system_error& ex) { std::cout << "exception: " << ex.code().value() << " - " << ex.what() << std::endl; if(ex.code().value() == 2) // end of file { //FIXME: Удалять сессию должен сервер delete this; } } }); } boost::asio::ip::tcp::socket& session::socket() { return _socket; } void session::stop() { _socket.close(); } session::~session() { std::cout << "session destructor called" << std::endl; }