C++ Создание списка команд
В общем есть класс NEServer - который отвечает за подключение клиента по сокету и у него есть функция Shell, которая обрабатывает полученные данные от клиента.
Мне нужно сделать список команд, полученных от клиентов и в другом месте их выполнять/обрабатывать и некий результат обратно отправлять.
Т.е. есть интерфейс команды:
Код:
class ICommand
{
public:
virtual ~ICommand()
{
}
virtual bool Execute(...)=0;
};
{
public:
virtual ~ICommand()
{
}
virtual bool Execute(...)=0;
};
Каким образом лучше это реализовать? Или вобще стоит взять другую архитектуру обработки команд?
Суть задачи в общем-то состоит в том, что бы получать данные по сокету и их обрабатывать, выполнять разными компонентами прогрммы(т.к. Database, Resource, Html)
Код:
class Command
{
private:
CmdEnum _cmd;
string _arg;
public:
Command(CmdEnum cmd, string arg);
~Command();
CmdEnum GetCommand();
string* GetArg();
}
{
private:
CmdEnum _cmd;
string _arg;
public:
Command(CmdEnum cmd, string arg);
~Command();
CmdEnum GetCommand();
string* GetArg();
}
Execut'ор вызовет callback, который передаст результат пользователю.
Очередь для команд необходима в том месте, где будет заполняться структура Command. В случае, если в данный момент для определённой сессии выполняется команда, то поставить новую в очередь.
Тогда на callback возлаживается две функции: первая - сбрасывать флаг выполнения команды в текущий момент, вторая - запускать проверку, находятся ли в очереди ещё команды для определённой сессии.
Все команды получатся однородными - это какой-то Enum, обозначающий действие и строка - аргументы команды, которые можно парсить и отдавать, как массив аргументов.
Схему нарисовать? :)
Цитата: CassandraDied
Для "команды" можно не делать интерфейса, как мне кажется, достаточно простого перечисления и аргумента, то есть:
Список нужен для сессий. Как только пользователь подключается и передаёт команду, сервер заполняет структуру Command и передаёт её какому-нибудь Execut'ору в новом потоке.
Execut'ор вызовет callback, который передаст результат пользователю.
Очередь для команд необходима в том месте, где будет заполняться структура Command. В случае, если в данный момент для определённой сессии выполняется команда, то поставить новую в очередь.
Тогда на callback возлаживается две функции: первая - сбрасывать флаг выполнения команды в текущий момент, вторая - запускать проверку, находятся ли в очереди ещё команды для определённой сессии.
Все команды получатся однородными - это какой-то Enum, обозначающий действие и строка - аргументы команды, которые можно парсить и отдавать, как массив аргументов.
Схему нарисовать? :)
Код:
class Command
{
private:
CmdEnum _cmd;
string _arg;
public:
Command(CmdEnum cmd, string arg);
~Command();
CmdEnum GetCommand();
string* GetArg();
}
{
private:
CmdEnum _cmd;
string _arg;
public:
Command(CmdEnum cmd, string arg);
~Command();
CmdEnum GetCommand();
string* GetArg();
}
Execut'ор вызовет callback, который передаст результат пользователю.
Очередь для команд необходима в том месте, где будет заполняться структура Command. В случае, если в данный момент для определённой сессии выполняется команда, то поставить новую в очередь.
Тогда на callback возлаживается две функции: первая - сбрасывать флаг выполнения команды в текущий момент, вторая - запускать проверку, находятся ли в очереди ещё команды для определённой сессии.
Все команды получатся однородными - это какой-то Enum, обозначающий действие и строка - аргументы команды, которые можно парсить и отдавать, как массив аргументов.
Схему нарисовать? :)
Как вариант мне нравится, а вот что с быстродействием?
Если быстродействие относится к тому, как сервер будет обрабатывать запросы нескольких пользователей одновременно, то моё представление не учитывает этой части. Тут нужно специальную литературу почитать по написанию многопоточных серверов...