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

Поиск:

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


pattern`щик
****


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

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



для этого, нужен метагенератор, генерирующий метаинформацию из к примеру, такого макроса:
Код

INTERFACE_BEGIN(transaction_type)
   METHOD(
      std::string, // ret
      login, // method name
      std::string, // method arg
      std::string // method arg
   )
   METHOD(
      std::string, // ret
      get_balance, // method name
      std::string, // method arg
      std::string // method arg
   )
INTERFACE_END()

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

т.е. для этого интерфейса должна быть такая реализация:
Код

struct transaction_type {
   std::string login(std::string, std::string) {}
   std::string get_balance(std::string, std::string) {}
};


есть идеи?

Добавлено через 4 минуты и 44 секунды
Цитата(mes @  9.10.2010,  12:41 Найти цитируемый пост)
интуитивно напрашивается такой псевдо-код

вариант.
еще вариант, сделать так, чтоб ожидание происходило в деструкторе типа ответа. т.к. он в смарт-поинтере, если мы не приаттачились к нему, то в деструкторе ждать.

Цитата(mes @  9.10.2010,  12:41 Найти цитируемый пост)
вы хотите, чтоб у сервера на все пакеты были перегруженные функции с одним именем..

нет. на каждый тип команды свой метод обработчик на сервере.

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


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


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

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



Цитата(boostcoder @  9.10.2010,  11:46 Найти цитируемый пост)
есть идеи? 

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

сообщение про список типов видели ? если приведете функции обработчики к одному имени, то выгадаете (не кодогенеруеммую, а шаблонную) автоматизацию
smile
Цитата(boostcoder @  9.10.2010,  11:46 Найти цитируемый пост)
 на каждый тип команды свой метод обработчик на сервере.

естественно разный, но с таким же именем ))



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


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


pattern`щик
****


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

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



Цитата(mes @  9.10.2010,  12:52 Найти цитируемый пост)
как из макроса генерить описание серверного обработчика ? 

 smile нет.

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

Добавлено через 2 минуты и 48 секунд
Цитата(mes @  9.10.2010,  12:41 Найти цитируемый пост)
тогда вам поможет список_типов..

что имеется в виду?

Добавлено через 5 минут и 26 секунд
Цитата(mes @  9.10.2010,  12:52 Найти цитируемый пост)
естественно разный, но с таким же именем

имена у них тоже разные:
Код

struct implementation {
   implementation() {}

   void connectToServer_handler(connectToServer::result_type& r, const connectToServer::query_type& q);
   void getUserList_handler(getUserList::result_type& r, const getUserList::query_type& q);
};



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


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


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

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



Цитата(boostcoder @  9.10.2010,  11:54 Найти цитируемый пост)
что имеется в виду?

у буста что то в этом роде : 

Код

boost::mpl::for_each (register, boost::mpl::list<type1, type2, type3>);


ну а сервер выглядит так
Код

struct server {
  void handle (type1 &);
  void handle (type2 &);
  void handle (type3 &);

};



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


pattern`щик
****


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

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



т.е. вы предлагаете решение, в котором для идентификации методов используется список типов аргументов? я правильно Вас понял?

Цитата(mes @  9.10.2010,  13:13 Найти цитируемый пост)
struct server {
  void handle (type1 &);
  void handle (type2 &);
  void handle (type3 &);
};

неудобно тем, что имена одинаковые.
разобрать аргументы метода на список типов, и собрать их обратно - не проблема. проблема именно в имени метода.
PM WWW   Вверх
mes
Дата 9.10.2010, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  9.10.2010,  12:19 Найти цитируемый пост)
неудобно тем, что имена одинаковые.
разобрать аргументы метода на список типов, и собрать их обратно - не проблема. проблема именно в имени метода.

фактически именем метода будет выступать имя типа пакета..
а чем неудобно одинаковое имя ?

Добавлено через 51 секунду
Цитата(boostcoder @  9.10.2010,  12:19 Найти цитируемый пост)
 в котором для идентификации методов используется список типов аргументов?

да список типов будет определять какие обработчики предоставляет сервер.

Добавлено через 1 минуту и 58 секунд
Цитата(boostcoder @  9.10.2010,  12:19 Найти цитируемый пост)
разобрать аргументы метода на список типов, и собрать их обратно - не проблема. 

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

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

Добавлено через 4 минуты и 56 секунд
сейчас еще одна идея пришла... надо обдумать.. 



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


pattern`щик
****


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

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



Цитата(mes @  9.10.2010,  13:25 Найти цитируемый пост)
типы должны задаваться интерфейсом, который вы кодогенерируете..

имел в виду их и разобрать.

пока не представляю, что должно генерироваться на стороне клиента, чтоб прога скомпилилась..
на стороне сервера - понятно, из сгенерированного кода берется информация необходимая для связывания указателя на объект реализации интерфейса с которым должна связываться.
PM WWW   Вверх
mes
Дата 9.10.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  9.10.2010,  13:11 Найти цитируемый пост)
пока не представляю, что должно генерироваться на стороне клиента, чтоб прога скомпилилась..

клиент заканчивается отправкой сериализированного объекта в _сокет_.

Добавлено через 1 минуту и 30 секунд
хотя да.. я забыл что еще ответ надо ждать.. вот тут есть проблемка... 


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


pattern`щик
****


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

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



Цитата(mes @  9.10.2010,  14:33 Найти цитируемый пост)
хотя да.. я забыл что еще ответ надо ждать.. вот тут есть проблемка...

угу.
но вроде как можно приблизительно так(мысли в слух):
на стороне клиента, сгенериный интерфейс используется совместно с классом client<interface>
на стороне сервера, сгенериный интерфейс используется совместно с классом server<interface>
то что генерится, должно содержать в себе какое-то значение времени компиляции которое client<> и server<> будут читать, то можно реализовать их таким образом, чтоб каждый брал для себя только то, что ему нужно. 

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

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

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


pattern`щик
****


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

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



Цитата(boostcoder @  9.10.2010,  14:45 Найти цитируемый пост)
можно реализовать их таким образом, чтоб каждый брал для себя только то, что ему нужно.


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

// описание интерфейса из которого будет сгенерирован метакод.
INTERFACE_BEGIN(type1)
   METHOD(int, add, int, int);
   METHOD(int, sub, int, int);
INTERFACE_END()

// вызов процедуры так:
client<type1> client(...);
int result = client.add(2,1); // это было бы идеальным вариантом

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


и возвращаемся к старому вопросу:
1. что должен генерировать метагенератор на стороне клиента?
2. что должен генерировать метагенератор на стороне сервера?
3. как связать сгенерированную информацию с реальным, написанным нами, классом?
PM WWW   Вверх
mes
Дата 9.10.2010, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

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

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

Добавлено через 4 минуты и 45 секунд
насчет сервера... у нас есть некий компонент, который локально выполняет некую работу..
мы должны определить связку между запросом и компонентом..
т.е. на каждый тип запроса у нас должен быть бинд забирающий инфу откомпонента.. 
по идеи значит надо для диспетчера создать таблицу лямб функций возвращаюших ответ, на запрос..

Добавлено через 5 минут и 18 секунд
ну так и получается, что имя функции нам не нужно.. 



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


pattern`щик
****


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

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



Цитата(mes @  9.10.2010,  15:20 Найти цитируемый пост)
1. либо у нас строгая очередность, и нет следующего запроса пока не получет ответ. имхо, не имеет смысла

так и запланировано.
выше, я просто привел пример, каким образом можно получить неочередность. а так как запросы живут в одном io_service, то все они выполняются строго в том порядке, в каком были добавлены в очередь.
PM WWW   Вверх
mes
Дата 9.10.2010, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  9.10.2010,  14:26 Найти цитируемый пост)
а так как запросы живут в одном io_service, то все они выполняются строго в том порядке, в каком были добавлены в очередь. 

т.е. в сеть не отправляется ничего, до тех пора пока не получен ответ ? имхо не рационально .. 



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


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


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

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



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



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


pattern`щик
****


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

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



Цитата(mes @ 9.10.2010,  15:30)
Цитата(boostcoder @  9.10.2010,  14:26 Найти цитируемый пост)
а так как запросы живут в одном io_service, то все они выполняются строго в том порядке, в каком были добавлены в очередь. 

т.е. в сеть не отправляется ничего, до тех пора пока не получен ответ ? имхо не рационально ..

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

Добавлено через 3 минуты и 18 секунд
Цитата(mes @  9.10.2010,  17:38 Найти цитируемый пост)
кстати при подобной архитектуре сервер получается пассивным, т.е. сообщает только ту информацию которую запросил клиент..

да.

Цитата(mes @  9.10.2010,  17:38 Найти цитируемый пост)
очень часто бывает необходимость, о сообщение клиенту деталей без его запроса..

можно реализовать следующим образом: в client<> добавить deadline_timer, который сам будет слать серверу запросы, и при получении ответов, вызывать некоторый обработчик.

но и это не главное.

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


PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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