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

Поиск:

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


pattern`щик
****


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

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



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


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


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

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



Цитата(boostcoder @  9.10.2010,  09:52 Найти цитируемый пост)
но в теме не нашел ничего полезного касательно реализации.

да, я тоже прочитал, по старой памяти думал там больше полезного smile

Добавлено @ 11:03
вот например метод login... напишите отдельно, как Вы представляете, клиентскую и серверную часть функционала не затрагивая реализацию rpc, т.е. фактически конечные точки Вашей схемы.

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


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


pattern`щик
****


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

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



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

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


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


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

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



Цитата(boostcoder @  9.10.2010,  10:23 Найти цитируемый пост)
 а что именно описать? как это все происходит сейчас? или что?...

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

// client 
void login  () {
   login_t::result res << connection << login_t::query("name", "pass");

}
// server
void on_login (login_t::query cont & q )
{
     if (q.name==  ... && q.pass ==..  )
      connection << login_t::result (eOK);
  else ...
}


Добавлено @ 11:37
Цитата(boostcoder @  9.10.2010,  10:23 Найти цитируемый пост)
, его аргументы отправляются на сервер, десериализуются, вызывается назначенный для этого типа запроса обработчик, тот в свою очередь получает дополнительный аргумент по ссылке в который кладет ответ, ответ сериализуется, отправляется клиенту, клиент десериализует его, и возвращает юзеру объект типа ответа.

это как раз лишнее, так как  
Цитата(mes @  9.10.2010,  09:54 Найти цитируемый пост)
 не затрагивая реализацию rpc,



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


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


pattern`щик
****


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

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



понял.
вот нынешний реальный код на стороне клиента. он даже работает smile 
Код

      client client(argv[1], std::atoi(argv[2]));
      /**  */
      connectToServer::value_type ret = client.query<connectToServer>(std::string("John"));
      std::cout << ret->msg() << std::endl;
      getUserList::value_type ret1 = client.query<getUserList>(11);
      std::cout << ret1->users()[0] << std::endl;


client::query<>() возвращает смарт-поинтер.

Добавлено через 2 минуты и 25 секунд
Цитата(mes @  9.10.2010,  11:34 Найти цитируемый пост)
// client 
void login  () {
   login_t::result res << connection << login_t::query("name", "pass");
}
// server
void on_login (login_t::query cont & q )
{
     if (q.name==  ... && q.pass ==..  )
      connection << login_t::result (eOK);
  else ...
}

что-то у меня это по удобнее получилось smile

Добавлено через 4 минуты и 21 секунду
на стороне сервера, каждый тип команды, ассоциирован с методом обработчиком.
PM WWW   Вверх
mes
Дата 9.10.2010, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



первое что бросается в глаза, value_type не очень удачное название.. 



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


pattern`щик
****


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

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



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


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


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

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



второе, что у Вас не ассинхронный обмен - так и нужно ?



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


pattern`щик
****


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

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



Цитата(mes @  9.10.2010,  11:51 Найти цитируемый пост)
не ассинхронный обмен

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

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


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


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

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



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

как не знаю.. просто  за value_type уже закрепилось некоторое смысловое значение, которое не совпадает с приведенным применением.. 
ну например response_type или return_type ..

Добавлено через 2 минуты и 36 секунд
Цитата(boostcoder @  9.10.2010,  10:53 Найти цитируемый пост)
пока не вызывается один из методов value_type.

не до конца понял..
запрос к серверу идет здесь
Цитата(boostcoder @  9.10.2010,  10:44 Найти цитируемый пост)
  connectToServer::value_type ret = client.query<connectToServer>(std::string("John"));

или здесь 
Цитата(boostcoder @  9.10.2010,  10:44 Найти цитируемый пост)
    std::cout << ret->msg() << std::endl;

?


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


pattern`щик
****


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

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



Цитата(mes @  9.10.2010,  11:55 Найти цитируемый пост)
или return_type

да, так лучше.

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


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


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

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



Цитата(boostcoder @  9.10.2010,  10:53 Найти цитируемый пост)
 иначе, вызывающий поток приостанавливается

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

Добавлено через 4 минуты и 43 секунды
Цитата(boostcoder @  9.10.2010,  10:44 Найти цитируемый пост)
что-то у меня это по удобнее получилось 

ну так не удивительно.. я то написал спонтанно smile


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


pattern`щик
****


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

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



здесь:
Цитата

connectToServer::value_type ret = client.query<connectToServer>(std::string("John"));

он ставится в очередь на основе boost::thread + asio::io_service + boost::packaged_task<>

но при вызове любого из методов результата, вызывается boost::unique_future::get(), который приостанавливает вызывающий цикл.

Добавлено @ 12:08
Цитата(mes @  9.10.2010,  11:59 Найти цитируемый пост)
т.е. ассинхронность введена специально ?

да, специально.

Добавлено @ 12:14
хотя в этом есть некоторое не очевидное поведение: если вдруг asio::io_service::run выполнить в нескольких потоках(типа пул потоков), и сделать один запрос к серверу ничего не возвращающий но сохраняющий в объект сессии некоторое значение, и следом за ним сделать запрос получающий это значение, то может получится так, что второй запрос придет на сервер раньше smile 
чтоб исключить такую ситуацию, в тип нужно добавить служебный метод, что-то типа wait(). сделаю... позже..

Добавлено @ 12:19
Код

client client(...);
client.query<put_t>(33); // т.к. нам не интересно, уже доставилось значение, или нет
get_t::return_type res1 = client.query<get_t>(); // тут мы можем попытаться получить его в то время как оно еще в_очереди/в_пути


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


pattern`щик
****


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

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



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

#include <iostream>
#include <boost/shared_ptr.hpp>

struct implementation {
   void method() {}
};

template<typename C>
struct proxy {
   proxy(C* p):_parent(*p) {}

   template<typename T>
   void register_handler(void (C::*handler)()) {
   }
   
   C& _parent;
};

template<typename IF>
struct connection {
   connection():_impl(new IF),_proxy(_impl.get()) {
      _proxy.template register_handler<int>(&IF::method);
   }
   boost::shared_ptr<IF> _impl;
   proxy<IF> _proxy;
};

int main() {
   connection<implementation> context;
}


http://liveworkspace.org/?id=bb4bddf94368b...b96872fa347ec98
connection - объект сессии с клиентом.

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


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


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

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



интуитивно напрашивается такой псевдо-код :
Код

   rpc<login_t> 
     login(client, login_t::query("John"));

   login.wait(100);

   std::cout << login.result;

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

Добавлено через 3 минуты и 6 секунд
Цитата(boostcoder @  9.10.2010,  11:41 Найти цитируемый пост)
, каким образом можно авторегистрировать методы-обработчики на стороне сервера, 

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

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


--------------------
PM MAIL 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.0897 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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