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

Поиск:

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


pattern`щик
****


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

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



Цитата(mes @  23.11.2010,  06:23 Найти цитируемый пост)
например так :
http://liveworkspace.org/code/a357cc4dcc39...325200a257a9c02

а теперь расскажите, что Вам нужно сделать, чтоб работать с этой реализацией:
Код

struct bot
{
   void on_init () 
   {
        net.set_connection_handler (..); 
        net.set_incom_handler (..); 
   }
   void on_start () 
   {
         net.connect(); 
   }
   void on_connect () 
   {
        net<< ptcl::auth("bot");
   }
   void on_auth () 
   {
       net << ptcl::talkmsg("hallo");
   }
   void on_talkmsg ()
   {
       net << ptcl::talkmsg("I do not understand..")
   }
   void on_quit()
   {
       net.disconnect ();
   }
   void on_disconnect ()
   {
        app.quit();
   }
};


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


pattern`щик
****


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

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



user posted image
 smile 
PM WWW   Вверх
mes
Дата 23.11.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  23.11.2010,  07:22 Найти цитируемый пост)
а теперь расскажите, что Вам нужно сделать, чтоб работать с этой реализацией:

http://liveworkspace.org/code/2a06fead0535...966b9a7e53761fa

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


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


pattern`щик
****


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

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



хм smile 
но от кодогенерации отказаться все равно проблематично...

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


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


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

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



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

1. кодогенерация, на которую не опирается код не страшна.. 
2. никаких извращений с кодогенераций тут не нужно.. все решается "стандартными" средствами..

Добавлено через 12 минут и 59 секунд
Код

template<>
struct meta_packets<bot>
{
  typedef aaa::ident_ok M1;
  typedef aaa::ident_no M2;
  typedef aaa::talkmsg  M3;
};

это заменяется на mpl::vector

Код

template<class T>
struct meta_id;
template <>
struct meta_id<aaa::join> { enum { value = 0 }; };
template <>
struct meta_id<aaa::quit> { enum { value = 1 }; };
template <>
struct meta_id<aaa::ident_ok> { enum { value = 2 }; };
template <>
struct meta_id<aaa::ident_no> { enum { value = 3 }; };
template <>
struct meta_id<aaa::talkmsg> { enum { value = 4 }; };

это тоже автоматизируется на основе списка типов..
при том можно предоставлять различные стратегии "расчета" id..
Код

остается только формирование прокси вызова...
template<class T>
struct meta_invoker
{
   static void call(T& target,aaa::join const& msg)
   {
       target.on_join ();
   }

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



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


Эксперт
****


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

Репутация: 32
Всего: 101



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

Добавлено через 2 минуты и 42 секунды
вот только места кодогенерации я тут не нахожу, простите.
если для реализации сервера используется некий заголовок (описывающий интерфейс), то его (с вероятностью 99%) можно устроить так, что он же будет использоваться на клиенте.

PM MAIL   Вверх
baldina
Дата 23.11.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 32
Всего: 101



может опишем задачу с самого начала? про RPC и иже понятно.
есть два вопроса
1. как публикуется интерфейс? он статичен и известен заранее? или он (предпочтительно) в заголовке в виде методов класса? как много различных клиент-серверов будут основаны на этой архитектуре? может, речь идет об одной реализации, которая будет расширяться со временем?
2. а чего собственно добивается ТС? выразительности кода? простоты реализации клиента? простоты реализации сервера? простоты ввода новых методов в клиент и сервер (если это единственная реализация, развивающаяся во времени)? еще что-то?
PM MAIL   Вверх
mes
Дата 23.11.2010, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(mes @  23.11.2010,  13:42 Найти цитируемый пост)
тут вначале надо привести к удобовариваему виду 

допустим имеем набор сообщений.. 
Код

struct msg1 {};
struct msg2 {};
struct msg3 {};
struct msg4 { int i;};

обработчика для этих сообщений
Код

struct A {
   void on_msg1()  { std::cout << "11"; }
   void on_msg2()  { std::cout << "22"; }
   void on_msg3()  { std::cout << "33"; }
   void on_msg4()  { std::cout << "44"; }   
   void on_msg4а() { std::cout << "44а"; }   

};

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

template<>
struct discoly_proxy<A>
{
  typedef void a;
  
  A* o;
     
  a fn (msg1 const& m) { o-> on_msg1(); }
  a fn (msg2 const& m) { o-> on_msg2(); }
  a fn (msg3 const& m) { o-> on_msg3(); }
  a fn (msg4 const& m) { m.i<10 ?  o-> on_msg4() : o-> on_msg4a(); }
};


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

P.S. над msg4 я специально "поиздевался" чтоб показать возможность "не прямого" отражения сообщений на методы..



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


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


pattern`щик
****


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

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



mes, я не понимаю как в bot::on_ident_ok() можно передать значения не писав сериализацию/десериализацию и подставление значений в методы вручную.

Добавлено через 10 минут и 15 секунд
простите за глупый вопрос, но Ваш код перестал работать. smile 
я connection вставил в main(), и в bot передаю ссылку на него. и все.
PM WWW   Вверх
mes
Дата 23.11.2010, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  23.11.2010,  17:33 Найти цитируемый пост)
как в bot::on_ident_ok() можно передать значения, не писав сериализацию/десериализацию 

сериализация /десериализация нужна нам чтоб преодолеть границу приложения..
 
Цитата(boostcoder @  23.11.2010,  17:33 Найти цитируемый пост)
и подставление значений в методы вручную.

не понял о чем тут речь..

Добавлено через 4 минуты и 34 секунды
Цитата(boostcoder @  23.11.2010,  17:33 Найти цитируемый пост)
я connection вставил в main(), и в bot передаю ссылку на него. и все. 

ссылку в студию smile



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


pattern`щик
****


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

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



Цитата(mes @  23.11.2010,  18:46 Найти цитируемый пост)
ссылку в студию

http://liveworkspace.org/code/6e36b8856cbb...5dd99ff2cbefa03

Добавлено @ 19:16
Цитата(mes @  23.11.2010,  18:46 Найти цитируемый пост)
не понял о чем тут речь..

Вы предпочитаете слать типы:
Код

  net << aaa::ident_ok (); // имитация сигнала от сервера
  net << aaa::talkmsg(); // имитация сигнала от сервера 
  net << aaa::ident_no (); // имитация сигнала от сервера

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

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

// int client_impl::get_int(int);
template<>
struct real_call<client_impl_get_int_3> {
   typedef boost::signals2::signal<int(int)> handler_t;

   real_call(handler_t& h, sync_sender_t& _sender)
      :_handler(h),
      _sender(_sender)
   {}

   void call(const rpc_packet_data& raw) {
      client_impl_get_int_3 method_args = deserialize_type<client_impl_get_int_3>(raw);
      remove_ext<handler_t::slot_type::result_type>::type result = *_handler(method_args.arg0);
      sync_return for_send;
      std::stringstream os;
      {  boost::archive::binary_oarchive oa(os);
         oa << result;
      }
      for_send.data = os.str();
      _sender(for_send);

   }

private:
   handler_t& _handler;
   sync_sender_t& _sender;
};

вот как я это реализовал.
если метод не возвращает никакого значения, то сгенерится так:
Код

   void call(const rpc_packet_data& raw) {
      client_impl_get_int_3 method_args = deserialize_type<client_impl_get_int_3>(raw);
      _handler(method_args.arg0);
   }



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


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


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

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



Цитата(boostcoder @  23.11.2010,  17:33 Найти цитируемый пост)
 connection вставил в main(), 

когда vtable находилась в статической области, она обнулялась, а для автоматической памяти она заполнена мусором.. и соответветсвенно проверка на ноль не срабатывает, а aaa::join handler не установлен - следовательно вызов по невалидному указателю ..

Добавлено через 1 минуту и 14 секунд
сам простой вариант.. закомментируйте передачу aaa:join в соединение..



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


pattern`щик
****


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

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



Цитата(mes @  23.11.2010,  19:16 Найти цитируемый пост)
когда vtable находилась в статической области, она обнулялась, а для автоматической памяти она заполнена мусором.. и соответветсвенно проверка на ноль не срабатывает

понял.
http://liveworkspace.org/code/579c17cdd427...be4943ae1dbab2c
PM WWW   Вверх
mes
Дата 23.11.2010, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(mes @  23.11.2010,  18:16 Найти цитируемый пост)
сам простой вариант.

ах да я чего то забыл, что у нас уже есть фичи нового стандарта
Цитата

vtable({0}) 

smile

Добавлено через 6 минут и 44 секунды
Цитата(boostcoder @  23.11.2010,  18:06 Найти цитируемый пост)
но я за интерфейсы.

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

Добавлено через 11 минут и 14 секунд
Цитата(boostcoder @  23.11.2010,  18:06 Найти цитируемый пост)
поэтому, мне нужно в интерфейсах паковать аргументы в некоторую сгенеренную для этого метода структуру, 


http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%...%BD%D0%B8%D0%B5 :
Цитата

Отдельного пояснения требует понятие обмена сообщениями. Первоначально (например, в том же Smalltalk) взаимодействие объектов представлялось как «настоящий» обмен сообщениями, то есть пересылка от одного объекта другому специального объекта-сообщения. Такая модель является чрезвычайно общей. Она прекрасно подходит, например, для описания параллельных вычислений с помощью активных объектов, каждый из которых имеет собственный поток исполнения и работает одновременно с прочими. Такие объекты могут вести себя как отдельные, абсолютно автономные вычислительные единицы. Посылка сообщений естественным образом решает вопрос обработки сообщений объектами, присвоенными полиморфным переменным — независимо от того, как объявляется переменная, сообщение обрабатывает код класса, к которому относится присвоенный переменной объект.
Однако общность механизма обмена сообщениями имеет и другую сторону — «полноценная» передача сообщений требует дополнительных накладных расходов, что не всегда приемлемо. Поэтому в большинстве ныне существующих объектно-ориентированных языков программирования используется концепция «отправка сообщения как вызов метода»

с учетом того, что накладные расходы (сериализация) нас не смущают..
 smile

Добавлено через 13 минут и 17 секунд
Цитата(boostcoder @  23.11.2010,  18:06 Найти цитируемый пост)
но я за интерфейсы.

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


Это сообщение отредактировал(а) mes - 23.11.2010, 19:27


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


pattern`щик
****


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

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



Цитата(mes @  23.11.2010,  19:27 Найти цитируемый пост)
этим вы обрубаете себе возможность, соотносить вызов один ко многим..

епс smile 
кучу всего нужно переписать...

Добавлено через 56 секунд
Цитата(mes @  23.11.2010,  19:27 Найти цитируемый пост)
Отдельного пояснения требует понятие обмена сообщениями. Первоначально (например, в том же Smalltalk) взаимодействие объектов представлялось как «настоящий» обмен сообщениями, то есть пересылка от одного объекта другому специального объекта-сообщения. Такая модель является чрезвычайно общей. Она прекрасно подходит, например, для описания параллельных вычислений с помощью активных объектов, каждый из которых имеет собственный поток исполнения и работает одновременно с прочими. Такие объекты могут вести себя как отдельные, абсолютно автономные вычислительные единицы. Посылка сообщений естественным образом решает вопрос обработки сообщений объектами, присвоенными полиморфным переменным — независимо от того, как объявляется переменная, сообщение обрабатывает код класса, к которому относится присвоенный переменной объект.
Однако общность механизма обмена сообщениями имеет и другую сторону — «полноценная» передача сообщений требует дополнительных накладных расходов, что не всегда приемлемо. Поэтому в большинстве ныне существующих объектно-ориентированных языков программирования используется концепция «отправка сообщения как вызов метода»

превосходный пример smile 
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.0928 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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