В примере: http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/chat/chat_server.cpp мы всегда создаем новый указатель для приема нового сеанса. Если этого не произойдет, сервер отключится (в случае ошибки). Мой сервер имеет лимит набора идентификаторов, и каждый сеанс получает его. Поэтому, когда set is empty, сервер не может отвечать на новый сеанс, пока один из ID не освободится. Как предотвратить завершение работы сервера без создания дополнительных объектов и любых циклов? (Сервер может получить ~ 1k соединений до тех пор, пока один из ID не будет освобожден, и это вызовет создание 1k дополнительных объектов в случае использования примерного шаблона).Как предотвратить работу сервера C++ asio tcp?
void handle_accept(chat_session_ptr session,
const boost::system::error_code& error)
{
if (!error || !setIds.empty())
{
session->start();
chat_session_ptr new_session(new chat_session(io_service_, room_));
acceptor_.async_accept(new_session->socket(),
boost::bind(&chat_server::handle_accept, this, new_session,
boost::asio::placeholders::error));
}
}
Закончить '' if'' после '' session-> start(); '' и '' else'' поставить какой-то '' session-> close(); ''. Поэтому, когда '' setIds'' пуст, вы сразу же закрываете сеанс после его открытия, когда его нет - вы начнете его нормально, и в обоих случаях вы по-прежнему будете принимать другие соединения. – NikolayKondratyev