2015-02-13 1 views
0

В примере: 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)); 
    } 
    } 
+0

Закончить '' if'' после '' session-> start(); '' и '' else'' поставить какой-то '' session-> close(); ''. Поэтому, когда '' setIds'' пуст, вы сразу же закрываете сеанс после его открытия, когда его нет - вы начнете его нормально, и в обоих случаях вы по-прежнему будете принимать другие соединения. – NikolayKondratyev

ответ

1

Похоже, что вы, вероятно, должны создать какое-то условие ожидания, прежде чем принимать новое соединение, если вы «вне удостоверения личности».

Потому что, если вы этого не сделаете, вы можете просто продолжать принимать путем

acceptor_.async_accept(new_session->socket(), 
     boost::bind(&chat_server::handle_accept, this, new_session, 
     boost::asio::placeholders::error)); 

безусловна, но есть цикл: вы будете тратить ресурсы принимать соединения, которые вы не можете справиться пока идентификаторы не станут доступными.

Что еще хуже (потенциально), вы будете отключать соединения, которые могли бы вам просто обработать, скажем, 1 мс, 10 мс или 100 мс позже.

Я предлагаю разрешить ОС поддерживать такие связи в отставании - не принимая их на ранней стадии.


В качестве альтернативы, вы можете принять все соединения, но поставить их в очередь, если вы из идентификаторов (только начинают падать соединения, когда очередь пуста). Я бы подумал об использовании семафора для управления пулом доступного идентификатора.

Смежные вопросы