Re: [Asio-samples-users] вопрос по добавлению IP-black-list в session_manager
Status: Beta
Brought to you by:
mabrarov
From: Marat A. <ab...@gm...> - 2012-05-07 13:26:56
|
Добрый день. > в локальную поделку на основе asio-samples, хочу добавить список банов по IP. > вопрос в том, как в данном случае нужно поступить с session_manager::accept_state. См. session_manager::handle_accept_at_work. Там есть такой код: ~~~~~~~~~~~~~~~ if (active_sessions_.size() >= max_session_count_) { recycle(session); continue_work(); return; } ~~~~~~~~~~~~~~~ Ниже этого кода следует вставить: ~~~~~~~~~~~~~~~ if (is_banned(session)) { // Я предполагаю, что TCP-соединение просто закрывается в таком случае, // Если "нет" - то надо заменить вызов recycle() на что-то свое. recycle(session); // В любом случае продолжаем работать - не останавливаться же по такому случаю. // Если новый accept запускать нельзя, то меняем accept_state_ // на что-то отличное от accept_state::ready и не забываем // когда-нибудь позже сменить его на accept_state::ready и вызывать continue_work() continue_work(); // Вызываем всегда во всех handle_XXX_at_work() return; } ~~~~~~~~~~~~~~~ > при запуске аксепта, accept_state устанавливается в in_progress и > инкрементируется pending_operations. > вопрос собственно в том, как поступать с этими переменными в случае > если подключившийся IP окажется в списке банов? > > просто устанавливать в: > accept_state = accept_state::in_progress; > --pending_operations; > > ? См. ответ выше. > еще не очень понятно как поступить с цепочкой вызовов: handle_accept > -> handle_accept_at_work -> continue_work > ? > > начиная с какого вызова будет правильным будет запускать следующий > аксепт в случае если текущий подключившийся находится в списке банов? Следующий accept запускается в continue_work, если это позволяет "комплексное" состояние session_manager. В общем случае, в handle_accept_at_XXX следует всегда декрементировать pending_operations и всегда менять accept_state_ на значение, отличное от accept_state::in_progress. continue_work запустит новый accept, если не достигнут лимит активных сессий и accept_state_ == accept_state::ready (это необходимое, но не достаточное условие). Regards, Marat Abrarov. |