Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаленный вызов. детали, реализация, архитектура, у темы новое название! 
:(
    Опции темы
mes
Дата 9.10.2010, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  9.10.2010,  19:25 Найти цитируемый пост)
1. что должен генерировать метагенератор на стороне клиента?
2. что должен генерировать метагенератор на стороне сервера?
3. как связать сгенерированную информацию с реальным, написанным нами, классом? 


имхо вопрос не с той стороны задан.. 
для начала нужно представить модель, а как потом это все запихнуть в кодогенерацию дело техники 
smile

Добавлено через 39 секунд
т.е. для начала надо представить как будет выглядить код..

Добавлено через 1 минуту и 17 секунд
итак Вы решили (с чем я не согласен) что синхронность будет удобнее..

Добавлено через 2 минуты и 12 секунд
тогда у нас есть rpc::client, к которому мы можем посылать запросы и получать ответ

Добавлено через 3 минуты и 48 секунд
выполнение запроса все равно будет проходить в паралельном потоке, поэтому мы можем чем нибудь себя занять, но при этом должны уметь контролировать состояние запроса ..

Добавлено через 4 минуты и 44 секунды
тогда при отправке запроса, мы должны получить некую структуру контроллера-наблюдателя..

Добавлено через 8 минут и 32 секунды
допустим это будет выглядить так :

Код

rpc::track<rpc::login> login = client.send ( rpc.login::query("John"));
login.set_timeout (30);
while ( login.in_process() ) do_something ();
if ( ! login().is_ok() )  return;


Добавлено через 9 минут и 45 секунд
отвлекемся на сервер .. 



--------------------
PM MAIL WWW   Вверх
mes
Дата 9.10.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



сервер хранит модель и список клиентов (сокетов) которые хотят ее изменить.. 
объект сервера выступает своего рода контроллером этих взаимодействий
тогда 
Код

struct server {

   list <client *> clients;
   model_t  model;
 
   void handle (client& , rpc::login);
   void handle (client& .. ); 
  
};


Добавлено @ 21:16
теперь нам необходимо как то зарегистрировать функции 
можно сделать массив/карту делегатов и связать их,

Добавлено @ 21:21
а можно отделить внутренности сервера от методов обработчиков .. 
тогда вместо методов обработчиков определяем таблицу вызовов
и тогда регистриуемая функция будет иметь вид
Код

template<class T>
void () (client&, server_context& , T& packet ) ;


естественно вместо самих функций моно использовать лямбды.. но чтоб не сбиваться идем простым путем.. 

Это сообщение отредактировал(а) mes - 9.10.2010, 21:23


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 9.10.2010, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  9.10.2010,  20:58 Найти цитируемый пост)
итак Вы решили (с чем я не согласен) что синхронность будет удобнее..

нет. асинхронность можно реализовать. просто в данный момент мне это не кажется первостепенной задачей.

пишу мысли... минутку..
PM WWW   Вверх
mes
Дата 9.10.2010, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

Добавлено @ 21:30
итого значит у нас есть rpc::server и rpc::client (не пустать с rpc::server::client ) осуществляющие связь посредством сырых данных и взаимодействующие с пользователем типизированным пакетами.

Добавлено @ 21:36
т.е общий код выглядит так 
Код

// server
rpc::server<model_t> server;
server.register_handler ([](rpc::server<>::client& , model_t&, rpc::login&) // это можно задефайнить
              {       } )

// client
rpc::track<rpc::login> login = client.send ( rpc.login::query("John"));


Добавлено через 9 минут и 58 секунд
писал rpc::login но по сути пакеты должны находится в другом неймспейсе, например название протокола..

Добавлено через 11 минут и 7 секунд
все.. вроде свои мысли высказал..


Это сообщение отредактировал(а) mes - 9.10.2010, 21:36


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 10.10.2010, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



вот как я вижу модель:
в данный момент, для каждого входящего соединения(т.к. клиенты сначала подключаются к серверу), создается объект, указанный в типе шаблона сервера. таким образом, получается так, что каждый клиент общается со своим собственным объектом. при завершении сеанса, объект удаляется.
есть еще вариант, инициализировать объект сервер, ссылающимся на общий для всех клиентов объект. в таком случае, так как объект реализует кодер, то синхроннизация/разделение_доступа ложится на него.
Код

type1 t1;
server<type1> server(...);
server.bind(t1);


тогда, в дополнение, было бы мегаудобным, реализовать в классе client<> запрос, типа create_session<type>(). который будет на стороне сервера создавать объект сессии, и переключать контекст клиента на этот объект.
если пойти немного дальше, то класс server<> можно реализовать так, чтоб список шаблонных аргументов был переменным. в таком случае, клиент, может делать запросы на создание какого-то конкретного объекта сессии, и пользоваться им.
Код

server<type1, type2, type3, type4> server(...);

...
...

client client(...);
client::session_ptr<type1> t1ptr = client.create_session<type1>();
// далее, вызываем методы предоставляемые типом type1
...

client::session_ptr<type2> t2ptr = client.create_session<type2>();
// далее, вызываем методы предоставляемые типом type2
...


но это все потом.
сейчас первостепенный вопрос в том, какие данные должен генерировать кодогенератор чтоб клиент и сервер могли автосвязывать запросы/ответы с методами/реализацией?

Это сообщение отредактировал(а) boostcoder - 10.10.2010, 01:58
PM WWW   Вверх
mes
Дата 10.10.2010, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  10.10.2010,  00:54 Найти цитируемый пост)
в данный момент, для каждого входящего соединения(т.к. клиенты сначала подключаются к серверу), создается объект, указанный в типе шаблона сервера. таким образом, получается так, что каждый клиент общается со своим собственным объектом. при завершении сеанса, объект удаляется.

но насколько я понял, у вас к примеру  есть комнаты, в которые могут зайти разные клиенты, а значит сессия (или ее контекст) не у каждого своя а разделяемая(shared).

Цитата(boostcoder @  10.10.2010,  00:54 Найти цитируемый пост)
если пойти немного дальше, то класс server<> можно реализовать так,

детали реализации действительно лишние.. как удобнее сделать, будет видно при кодировании.. главное разобраться с сутью взаимоотношений.



Цитата(boostcoder @  10.10.2010,  00:54 Найти цитируемый пост)
сейчас первостепенный вопрос в том, какие данные должен генерировать кодогенератор чтоб клиент и сервер могли автосвязывать запросы/ответы с методами/реализацией?

на мой взгляд достаточно только генерации пакетов, и списка типов пакетов. 
клиент и сервер должны быть целыми (не кодогенерируемыми) шаблонами.

Добавлено @ 09:39
список типов определяет какими сообщениями они могут обмениваться, а также для для сервера служит основой для таблицы регистрации..

Добавлено @ 09:44
как выглядит пакет и какие данные он должен содержать зависит от клиента и сервера.. поэтому имхо первостепенный вопрос стоит не в кодогенераторе, а в проектирование конечных точек соединения.. при том для упрoщения можно реализовывать в одной проге и  передавать данные напрямую, как в начале темы через  функции типа  void call(id, void*);

Это сообщение отредактировал(а) mes - 10.10.2010, 09:44


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 11.10.2010, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  10.10.2010,  09:37 Найти цитируемый пост)
но насколько я понял, у вас к примеру  есть комнаты, в которые могут зайти разные клиенты, а значит сессия (или ее контекст) не у каждого своя а разделяемая(shared).

сессия - контекст пользователя/соединения.
комнаты - некоторые объекты, взаимодействие с которыми происходит посредством сессий.

Цитата(mes @  10.10.2010,  09:37 Найти цитируемый пост)
на мой взгляд достаточно только генерации пакетов, и списка типов пакетов. 
клиент и сервер должны быть целыми (не кодогенерируемыми) шаблонами.

наверное я вас не понимаю.. поясните пожалуйста.

немного пораздумав.. должно получиться как-то так:
Код

// декларация интерфейса.
INTERFACE_BEGIN(type1)
   METHOD(int, add, int, int);
   METHOD(int, sub, int, int);
INTERFACE_END()

// нужно сгенерировать что-то вроде этого:
// этот код используется только на стороне клиента.
struct type1 {
   int add(int a, int b) {
      static const int function_id = 0; // вставляет кодогенератор
      // пакуем данные..
      serialize(function_id, a, b); // вставляет кодогенератор
      // посылаем, десериализуем, возвращаем результат
      return send(serialized_buffer);
   }
   int sub(int a, int b) {
      static const int function_id = 1; // вставляет кодогенератор
      // пакуем данные
      serialize(function_id, a, b); // вставляет кодогенератор
      // посылаем, десериализуем, возвращаем результат
      return send(serialized_buffer);
   }
private:
   type1(protocol_implementation& pi):pi(pi) {}

private:
   protocol_implementation& pi;
};

// класс клиента:
template<typename IF>
struct client: IF {
   client(host, port):IF(pi),pi(host, port) {}

private:
   protocol_implementation pi;
};

// ну и на клиентской стороне использовать так:
client<type1> client(...);
int res = client.add(2,3);
int res1 = client.sub(res,3);


сервер:
Код

// на стороне сервера, юзер пишет реализацию:
struct type1 {
   int add(int a, int b) {
      return a+b;
   }
   int sub(int a, int b) {
      return a-b;
   }
};
// но, т.к. реализацию пишем мы сами, сервер должен уметь связывать локальный объект с 
// идентификаторами которые использует клиент для обозначения метода используемого для обработки посланного запроса.
// т.е. получается так, что метагенератор должен генерировать какой-то класс, присваивая ему имя типа binder_for_type1.
// но что из себя должен представлять класс binder_for_type1? и какую информацию содержать?



Это сообщение отредактировал(а) boostcoder - 11.10.2010, 02:39
PM WWW   Вверх
mes
Дата 11.10.2010, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



ловите в упрощенном виде : http://liveworkspace.org/code/bbc75134b93c...914597f9c23e38b
с односторонним обменом клиент->сервер

rpc - библиотека конечных точек взаимодействия
ptcl -(кодогенерируемый) протокол обмена
my_server - оболочка реализующая поведение сервера (может быть определена как неймспейсом, так и классом)

ну и в глобальном пространстве условных запуск трех программ, сервера и двух клиентов.. 




--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 11.10.2010, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



mes, большое спасибо smile 
сейчас буду разбираться.

зы
на liveworkspace работает табуляция в коде. еще Ctrl+G, Ctrl+F, Ctrl+R, Ctrl+Z. оцените smile 

Это сообщение отредактировал(а) boostcoder - 11.10.2010, 10:53
PM WWW   Вверх
mes
Дата 11.10.2010, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



 smile 
Цитата(boostcoder @  11.10.2010,  09:48 Найти цитируемый пост)
на liveworkspace работает табуляция в коде. еще Ctrl+G, Ctrl+F, Ctrl+R. оцените

даже не ожидал  ! учту, спасибо )



--------------------
PM MAIL WWW   Вверх
mes
Дата 11.10.2010, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



и я еще раз насчет (а)синхронности...  мне кажется вместо классического вызова функций с получением ответа, где сервер выступает в пассивной форме,
удобнее было бы воспользоваться системой взаимообмена сообщений, тогда клиент будет обладать такой же таблицей методов, как и сервер
а пакеты разделяться на две группы (client_to_server, server_to_client);




Это сообщение отредактировал(а) mes - 11.10.2010, 13:45


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 11.10.2010, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @ 11.10.2010,  11:10)
и я еще раз насчет (ас)синхронности...  мне кажется вместо классического вызова функций с получением ответа, где сервер выступает в пассивной форме,
удобнее было бы воспользоваться системой взаимообмена сообщений, тогда клиент будет обладать такой же таблицей методов, как и сервер
а пакеты разделяться на две группы (client_to_serever, server_to_client);

да. согласен. это хороший вариант.

PM WWW   Вверх
boostcoder
Дата 25.10.2010, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



продолжим-с...
что у меня есть сейчас:
Код

struct i_registration_api {
   virtual void user_exists_handler ( user_exists_result&, const user_exists_query& ) = 0;
   virtual void registration_handler ( registration_result&, const registration_query& ) = 0;
   virtual void activation_handler ( activation_result&, const activation_query& ) = 0;
   i_registration_api () {
      _map[0] = i_invoker_ptr( new invoker< i_registration_api, user_exists >(this, &i_registration_api::user_exists_handler ) );
      _map[1] = i_invoker_ptr( new invoker< i_registration_api, registration >(this, &i_registration_api::registration_handler ) );
      _map[2] = i_invoker_ptr( new invoker< i_registration_api, activation >(this, &i_registration_api::activation_handler ) );
   }
   // этот метод дергает сервер. наверное его нужно спрятать от юзера...
   virtual void proxy_call(constants::header_packet& h, constants::body_packet& b) {
      int id = header_coders::decode_header(h).id;
      _map[id]->dispatch(h, b);
   }
private:
   std::map<int, i_invoker_ptr> _map;
};


этот код генерит метагенератор.
юзеру остается унаследоваться от этого класса, и реализовать чистовиртуальные методы.
как видно, для каждой команды свой метод обработчик. не плохо..

недостаток в том, что пока что, сервер строго привязан типом шаблона.
полагаю, сейчас нужно реализовать динамическое создание классов-обработчиков.

идея такая: метегенератору указывать имя метаконтейнера который он должен сгенерить помимо класса. и когда юзер запрашивает создание объекта некоторого типа, сервер в метаконтейнере выискивает этот тип. на этом мои мысли исчерпываются..


mes, вы в теме? smile 

Это сообщение отредактировал(а) boostcoder - 25.10.2010, 23:43
PM WWW   Вверх
mes
Дата 26.10.2010, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  25.10.2010,  22:41 Найти цитируемый пост)
недостаток в том, что пока что, сервер строго привязан типом шаблона.

не до конца понятно о чем тут.. 

над кодом сейчас подумаю.. но сразу чувствуется, что пока это не то что надо .. 


Это сообщение отредактировал(а) mes - 26.10.2010, 11:29


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 26.10.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  26.10.2010,  11:28 Найти цитируемый пост)
не до конца понятно о чем тут..

вот:
Код

struct registration_api: i_registration_api {
// реализуем виртуальные методы
};

server<registration_api> server(...); // все. сервер может работать только с этим типом.

но это плохая реализация. нелепо как-то, в один интерфейс пихать сотни методов smile 
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1026 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.