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

Поиск:

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


pattern`щик
****


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

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



Цитата(mes @  30.10.2010,  00:53 Найти цитируемый пост)
сейчас он называется net_client..

а почему аргумент у него типа rpc_paket, а не T ?
PM WWW   Вверх
mes
Дата 30.10.2010, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  29.10.2010,  23:43 Найти цитируемый пост)
еще не знаю как расшифровать sttc

Код

stc  :  s  -> c
cts  :  c  -> s
sttc :  s <=> c
ctc  :  c <-> c


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


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


pattern`щик
****


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

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



Цитата(mes @  30.10.2010,  01:01 Найти цитируемый пост)
sttc c<->s  

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


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


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

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



Цитата(boostcoder @  29.10.2010,  23:55 Найти цитируемый пост)
а почему аргумент у него типа rpc_paket, а не T ? 

ой сорри.. автоматом написал smile




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


pattern`щик
****


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

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



ок.

Добавлено через 5 минут и 50 секунд
Цитата(mes @  29.10.2010,  23:50 Найти цитируемый пост)
//  { reciever.dispatch(pack); }

и то что в комментах, полагаю, нужно использовать?
т.е. если флаг == ложь, то диспетчеризируем заново? но тогда несоответствие типов. т.к. rpc_distributor::dispatch принимает rpc_paket

я опять не понял?
PM WWW   Вверх
mes
Дата 30.10.2010, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  30.10.2010,  00:09 Найти цитируемый пост)
я опять не понял? 

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

Добавлено через 52 секунды
Цитата(boostcoder @  30.10.2010,  00:09 Найти цитируемый пост)
. т.к. rpc_distributor::dispatch принимает rpc_paket

угу.. пока тогда оставьте..потом подумаем как .. 



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


pattern`щик
****


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

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



Цитата(mes @  30.10.2010,  01:22 Найти цитируемый пост)
пока тогда оставьте..потом подумаем как .. 

ок.

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


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


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

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



по идеи решается установкой двух сендеров, внешнего и локального.. 



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


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


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

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



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



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


pattern`щик
****


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

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



реализовываю... но сейчас не закончу. с утра уже..
PM WWW   Вверх
mes
Дата 30.10.2010, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  30.10.2010,  00:53 Найти цитируемый пост)
реализовываю... но сейчас не закончу. с утра уже.. 

ок. спокойной ночи smile



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


pattern`щик
****


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

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



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


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


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

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



сейчас вот отклонился на диспатчеризацию сообщения контроллерам.. в основу лег вчерашний дистрибьютор..
http://liveworkspace.org/code/aaf4c9421678...9b522c0dbe5d4ef
чтоб не путаться рассматрение идет без внешних элементов ( в том числе сервера)
и для начала только один тип сообщения  простой - вызов... 




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


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


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


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

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



теперь добавлена карта сообщений:
http://liveworkspace.org/code/93bbe9011487...5ee4e2130e216d3

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

Добавлено через 39 секунд
для сохраности выложу тут :
Код

#include <iostream>
#include <vector>
#include <map>
#include <memory>
#include <test_ptcl.hpp>
//....................................................................

template <typename C, typename A>
A& get_target (C& c);

template <typename C>
struct distributor
{
       template <typename T>
       void dispatch (T const &msg) 
       {
         auto p = m_map.find (T::meta_id);
         if (p != m_map.end())
            for (auto it = p->second.begin (); it != p->second.end(); ++it )
            {
                 (*it)->invoke(c, &msg);
            }
      }
      template <typename A, typename T>
      void add_handler ( void (A::*mtd)(T const& msg) )
      {
            m_map[T::meta_id].push_back(i_invoker_ptr (new invoker<A,T>(mtd)) ); 
      }
      struct i_invoker {
         virtual void invoke (C&, void const*) =0;               
      };
      typedef std::shared_ptr<i_invoker> i_invoker_ptr;
      
      template<typename A, typename T>
      struct invoker : i_invoker
      {
         typedef void (A::*mtd_t)( T const & );
         virtual void invoke (C& c, void const* )
         {
            (get_target<C,A>(c).*m_mtd)(T());
         }
         invoker (mtd_t mtd) : m_mtd(mtd) {}
      private:  
         mtd_t  m_mtd;
      };

      distributor(C& c_) : c(c_) {}
   private:     
      C& c;
      std::map<size_t, std::vector<i_invoker_ptr> > m_map;
};

//....................................................................
struct junction;

struct one_ctrl  {
      void fn (stc::welcome const&) { std::cout << ".one.fn()"<< std::endl; } 
      
      one_ctrl (junction& jn)  : m_junction(jn) {}      
   private:   
      junction &m_junction;
};
struct two_ctrl  
{
      void fn (stc::welcome const&) { std::cout << ".two.fn()"<<std::endl; } 
   
      two_ctrl (junction& jn)  : m_junction(jn) {}      
   private:   
      junction &m_junction;   
};
struct main_ctrl 
{
      void fn (stc::welcome const&) { std::cout << ".main.fn()"<<std::endl; } 

      main_ctrl (junction& jn)  : m_junction(jn) {}      
   private:   
      junction &m_junction;      
}; 

//....................................................................

struct junction {
 
    main_ctrl  main;
    one_ctrl   one;
    two_ctrl   two;
    
    void direct_call () {
      std::cout << "direct call:" << std::endl;       
      main.fn ( stc::welcome () );
      one.fn  ( stc::welcome () );
      two.fn  ( stc::welcome () );
    }
    
    void dispatched_call () {
      std::cout << "dispatched:" << std::endl;    
      m_distr.dispatch ( stc::welcome() ); 
   }
    
    junction () : main    (*this)
                , one     (*this)
                , two     (*this)
                , m_distr (*this)
    {
           
         m_distr.add_handler (&one_ctrl::fn);
         m_distr.add_handler (&two_ctrl::fn);
         m_distr.add_handler (&main_ctrl::fn);                 
    }    
    private:  
      distributor<junction>    m_distr;
};
// todo: убрать из глобальной видимости.. 
template <>
main_ctrl& get_target (junction& jn) { return jn.main; }
template <>
one_ctrl& get_target (junction& jn) { return jn.one; }
template <>
two_ctrl& get_target (junction& jn) { return jn.two; }


//....................................................................


int main ()
{
   junction ctrl;
   
   ctrl.direct_call();  
   ctrl.dispatched_call ();
}



Добавлено через 1 минуту и 29 секунд
ну и результат :
Цитата

direct call:
.main.fn()
.one.fn()
.two.fn()
dispatched:
.one.fn()
.two.fn()
.main.fn()


Добавлено через 14 минут и 12 секунд
хотя нет..  еще есть одна проблемка, для додумывания..
 сейчас get_target предполагает, что только один контролер каждого типа бывает.. 
 нужно добавить зависимость от статического ид агента/контролера..



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


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


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

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



Цитата(mes @  30.10.2010,  10:21 Найти цитируемый пост)
хотя нет..  еще есть одна проблемка, для додумывания..
 сейчас get_target предполагает, что только один контролер каждого типа бывает.. 
 нужно добавить зависимость от статического ид агента/контролера..

вот в необлагороженном варианте :
http://liveworkspace.org/code/c1d2db5ef563...c691b0a0e317e2c
Код

#include <iostream>
#include <vector>
#include <map>
#include <memory>
#include <test_ptcl.hpp>
//....................................................................

template <typename C, typename A, size_t CID>
struct get_target;


template <typename C>
struct distributor
{
       template <typename T>
       void dispatch (T const &msg) 
       {
         auto p = m_map.find (T::meta_id);
         if (p != m_map.end())
            for (auto it = p->second.begin (); it != p->second.end(); ++it )
            {
                 (*it)->invoke(c, &msg);
            }
      }
      template <size_t CID, typename A, typename T >
      void add_handler ( void (A::*mtd)(T const& msg) )
      {
            m_map[T::meta_id].push_back(i_invoker_ptr (new invoker<A,T>(mtd)) ); 
      }
      struct i_invoker {
         virtual void invoke (C&, void const*) =0;               
      };
      typedef std::shared_ptr<i_invoker> i_invoker_ptr;
      
      template<typename A, typename T, size_t CID=0>
      struct invoker : i_invoker
      {
         typedef void (A::*mtd_t)( T const & );
         virtual void invoke (C& c, void const* )
         {
            A& o  = get_target<C,A,CID>::get(c);
            
            (o.*m_mtd)(T());
         }
         invoker (mtd_t mtd) : m_mtd(mtd) {}
      private:  
         mtd_t  m_mtd;
      };

      distributor(C& c_) : c(c_) {}
   private:     
      C& c;
      std::map<size_t, std::vector<i_invoker_ptr> > m_map;
};

//....................................................................
struct junction;

struct one_ctrl  {
      void fn (stc::welcome const&) { std::cout << ".one.fn()"<< std::endl; } 
      
      one_ctrl (junction& jn)  : m_junction(jn) {}      
   private:   
      junction &m_junction;
};
struct two_ctrl  
{
      void fn (stc::welcome const&) { std::cout << ".two.fn()"<<std::endl; } 
   
      two_ctrl (junction& jn)  : m_junction(jn) {}      
   private:   
      junction &m_junction;   
};
struct main_ctrl 
{
      void fn (stc::welcome const&) { std::cout << ".main.fn()"<<std::endl; } 

      main_ctrl (junction& jn)  : m_junction(jn) {}      
   private:   
      junction &m_junction;      
}; 

//....................................................................

struct junction {
 
    one_ctrl   one;
    two_ctrl   two;
    main_ctrl  main;  
    two_ctrl   two1;
    
    void direct_call () {
      std::cout << "direct call:" << std::endl;       
      main.fn ( stc::welcome () );
      one.fn  ( stc::welcome () );
      two.fn  ( stc::welcome () );
      two1.fn ( stc::welcome () );
      std::cout << std::endl; 
    }
    
    void dispatched_call () {
      std::cout << "dispatched:" << std::endl;    
      m_distr.dispatch ( stc::welcome() ); 
      std::cout << std::endl;       
   }
    
    junction () : main    (*this)
                , one     (*this)
                , two     (*this)
                , two1    (*this)                
                , m_distr (*this)
    {
           
         m_distr.add_handler<0> (&one_ctrl::fn);
         m_distr.add_handler<0> (&two_ctrl::fn);
         m_distr.add_handler<0> (&main_ctrl::fn);                 
         m_distr.add_handler<1> (&two_ctrl::fn);
    }    
    private:  
      distributor<junction>    m_distr;
};
// todo: убрать из глобальной видимости.. 
template <>
struct get_target<junction, main_ctrl, 0> {
 static main_ctrl& get (junction& jn) { return jn.main; }
};
template <>
struct get_target<junction, one_ctrl, 0> {
 static one_ctrl& get (junction& jn) { return jn.one; }
};
template <>
struct get_target<junction, two_ctrl, 0> {
 static two_ctrl& get (junction& jn) { return jn.two; }
};
template <>
struct get_target<junction, two_ctrl, 1> {
 static two_ctrl& get (junction& jn) { return jn.two1; }
};



//....................................................................


int main ()
{
   junction ctrl;
   
   ctrl.direct_call();  
   ctrl.dispatched_call ();
}

а для доведения ума, уже  нужен будет mpl ..

Добавлено @ 12:10
boostcoder, и как время будет, добавьте плиз, в структуры тестового протокола пару дата_членов с сериализаций..
для тестирования..

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

думаю стоит показать smile




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


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


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

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