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

Поиск:

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


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


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

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



попытаюсь в этой теме поразмышлять, как бы я реализовывал бы общение..
возьмем для примера класс auth...

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

Код

struct auth
{
    void identify ();
    void quit ();

    bool has_ident () const;
};


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

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




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


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


pattern`щик
****


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

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



Цитата(mes @  23.11.2010,  01:57 Найти цитируемый пост)
попытаюсь в этой теме поразмышлять

это Вы об синхронных вызовах размышляете?
PM WWW   Вверх
mes
Дата 23.11.2010, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  23.11.2010,  01:01 Найти цитируемый пост)
это Вы об синхронных вызовах размышляете? 

нет... о распределенной интеграции объектов..

Добавлено через 2 минуты и 45 секунд
тогда мы имеем три сущности определяющий наш объект :
Код


namespace auth
{
   struct agent;
   
   struct service; 

   struct result;
   
};



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


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


pattern`щик
****


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

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



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

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


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


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

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



попробуем условно связать их : 
Код


namespace auth
{
   struct agent
   {
      void ident () { _service.ident_query(); }
      void quit ()  { _service.quit();        }
   
      bool has_ident const { _result.has_ident(); }
   };
   
   struct service 
   {
      void ident_query () { _result.ident_ok(); }
      void quit_query ()  { _result.quit();     }
   };
   
   struct result 
   {
      void ident_ok () { _has_ident = true; };
      void ident_err();
      void quit () { _has_ident = false; }
      
      bool has_ident const { _result.has_ident(); }
   };
   
};

где составляющие обладают такими условными связями.. 
Код

struct agent 
{
    service & _service;
    result & _result;
};

struct service 
{ 
    result & _result;
};


при такой схеме agent выступает в роли "верхней точки" -  интерфейса компонента.. 
service - отвечает за логику
result - за предоставление конечного состояния.. 

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

для начала рассмотрим сервис.. и так, чтоб его удалить у нас должно быть два его образа.. 
remote_service и real_service (или просто service)
Код

   struct remote_service
   {
      void ident_query () { _service.ident_query(); }
      void quit_query ()  { _service.quit_query();  }
   };
   
   struct service 
   {
      void ident_query () { _remote_result.ident_ok(); }
      void quit_query ()  { _remote_result.quit();     }
   };


в принципе результ будет подобен 
Код

 struct remote_result 
   {
      void ident_ok () { _result.ident_ok();};
      void ident_err();
      void quit () { _result.quit; }
   };   
   
   struct result 
   {
      void ident_ok () { _has_ident = true; };
      void ident_err();
      void quit () { _has_ident = false; }
      
      bool has_ident const { _result.has_ident(); }
   };



Цитата(boostcoder @  23.11.2010,  01:04 Найти цитируемый пост)
я даже слов таких не знаю   

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

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


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


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


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

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



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

   struct remote_service
   {
      template<class T>
      void query (const T& q) { _service.query(q); };
   }; 

   struct service 
   {
      void query (ident const&) { result (ptcl::ident_ok()); }
      void query (quit  const&) { result (ptcl::quit());     }
       template <class T>
      void result (T const& r)  { _remote_result.result(r); }
   };   

ptcl::.. - некие структуры..

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

  struct agent
   {
         void ident () { query(ptcl::ident() ); }
         void quit ()  { query(ptcl::quit() ); }
   
         bool has_ident const { _result.has_ident(); }

      protected:
          template<class T>
          void query (T const& q) { _service.query(q); }

      private:
          remote_service _service;
          result         _result;
   };


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


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


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


pattern`щик
****


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

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



mes, вот самый минимальный пример: http://code.google.com/p/discoly/source/br...amples/minichat
минимальней некуда smile 
PM WWW   Вверх
mes
Дата 23.11.2010, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(mes @  23.11.2010,  01:25 Найти цитируемый пост)
для этого нам нужна точка соединения

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

Добавлено через 12 минут и 3 секунды
agent может пользоваться более чем одним сервисом, поэтому remote_service в предыдущем примере является излишним и вместо него должна быть конечная точка, в  которой будем регистрировать нужные результаты.. 


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


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


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


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

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



Код

struct junction 
{
    template <class T, class TList>
    void register (Т& delegat)
    {
      //  на основе TList определяем какие структуры принимает делегат
      // сам делегат, должен обладать перегуженными функциями с зарезервированным  именем для всех структур..
    }
    template<class T>
    void send (T const&);
};

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




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


pattern`щик
****


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

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



mes, позвольте прерву Вас ;)
к примеру, если сейчас скомпилить и выполнить клиент и сервер из последнего примера, то когда любой из них отключается, второй сыплет эксепшены. это происходит из-за того, что нет общего механизма обработки отключений, и встроенный сервис ping_service все еще работает. хотя, я реализовал встроенный дисконнект сервис. и он работает. но не разработал общий принцип и последовательность операций при получении команды disconnect.
сейчас это реализованно следующим образом: любой из участников сессии может послать disconnect серверу. так же, сервер тоже может послать disconnect любому участнику.
но не реализована сама последовательность действий выполняемых при disconnect`е. полагаю, когда любой из участников получает от сервера disconnect, должен в ответ послать серверу ответ о том, что он готов отключится. это нужно для того, чтоб он мог выполнить необходимые действия, а не отключится тупо на пол пути. так вот...какие именно действия он должен выполнить - зависит от пользователя протокола. т.к. последовательность_действий - известна реализатору логики.
значит, сам класс net_client не должен знать обо всем этом. ему нужен хендлер, который он должен вызывать при получении disconnect. и по возврату из этого хендлера, он должен отсылать серверу подтверждение disconnect`а.

у сервера логика немного иная...

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


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


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

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



Код

struct agent
   {
         void ident () { query(ptcl::ident() ); }
         void quit ()  { query(ptcl::quit() ); }
   
         bool has_ident const { _result.has_ident(); }

          agent ( junction & j)  : _junction (j)
          { 
//             _junction.register<mpl::vector<ptcl::ident_ok, ptcl::ident_err> > (_result );              
//              _junction.register<result::accepted_typelist> (_result );
               _junction.register (_result);
          }
      protected:
          template<class T>
          void query (T const& q) { _junction.query(q); }
      private:
          junction&   _junction;
          result         _result;
   };


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


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


pattern`щик
****


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

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



mes, насколько я понимаю, Вы сейчас ищите способ уйти от кодогенерации?
PM WWW   Вверх
mes
Дата 23.11.2010, 03:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  23.11.2010,  01:57 Найти цитируемый пост)
 ему нужен хендлер, который он должен вызывать при получении disconnect. и по возврату из этого хендлера, он должен отсылать серверу подтверждение disconnect`а.

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

Добавлено через 1 минуту и 5 секунд
Цитата(boostcoder @  23.11.2010,  02:09 Найти цитируемый пост)
, насколько я понимаю, Вы сейчас ищите способ уйти от кодогенерации? 

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

Добавлено через 1 минуту и 56 секунд
Цитата(boostcoder @  23.11.2010,  01:57 Найти цитируемый пост)
к примеру, если сейчас скомпилить и выполнить клиент и сервер из последнего примера, то когда любой из них отключается, второй сыплет эксепшены

пропущен "уровень обработки.. " т.е. дырка в абстракции.. 



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


pattern`щик
****


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

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



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

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


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


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

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



Цитата(boostcoder @  23.11.2010,  01:57 Найти цитируемый пост)
что нет общего механизма обработки отключений, 

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

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


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


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

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