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

Поиск:

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


pattern`щик
****


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

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



Цитата(mes @  23.11.2010,  03:11 Найти цитируемый пост)
т.е как это ? при получении дисконнекта от сервера  отсылать подтверждение серверу ?!

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

Цитата(mes @  23.11.2010,  03:11 Найти цитируемый пост)
и каким боком этот хэндлер привязан к дисколи ?

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


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


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

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



теперь попробуем набросать чат для двух клиентов gui_client и bot_client

для начала представим взаимодействие окошка с клиентом :
Код

struct main_window 
{
     text_ctrl * _screen;
     text_ctrl * _sender;
     button    * _connect_btn;
     button    * _disconnect_btn;  

     main_window ()
     {
         bind (_sender.on_text_enter, &on_text_send, this..);
         bind .. _connect_btn
         bind .. _disconnect_btn
        
     }
     void on_text_send (evt_text_enter const& evt)
     {
            if (_client.auth().has_ident()) _client.talk.say(evt.get_text());        
     }
      void on_connect_btn (..)
      {
          if (!_client.net().is_connected) _client.net().connect();
       }
      void on_disconnect_btn (..)
      {
          if (_client.net().is_connected) _client.net().disconnect();
      }     
     client  _client;
};


Добавлено через 1 минуту и 34 секунды
Цитата(boostcoder @  23.11.2010,  02:22 Найти цитируемый пост)
дисконнект, хотя ожидает получить ответ. как быть?

при дисконнекте возбуждать событие (например reset) и передовать его агентам..

Добавлено через 2 минуты и 42 секунды
Цитата(boostcoder @  23.11.2010,  02:22 Найти цитируемый пост)
 но Вы наверное не смотрели еще исходники, и не вникли в реализацию сервисов? 

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


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


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


pattern`щик
****


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

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



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

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

Цитата(mes @  23.11.2010,  03:31 Найти цитируемый пост)
еще нет.. для начала я хочу почувствовать по какому пути пошел бы я.. чем сейчас и занимаюсь

ага. понял.

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


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


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

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



тогда класс клиент состоит из трех агентов 
Код

struct client
{
    net_agent  _net;
    auth_agent _auth;
    talk_agent _talk;    
};


Добавлено @ 03:40
Цитата(boostcoder @  23.11.2010,  02:36 Найти цитируемый пост)
нет...это понятно. но серверу что делать, если агенты все еще ждут от него некоторых данных/действий ?

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

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

Добавлено @ 03:49
Код


struct client
{
    junction  _j;
    net_agent  _net;
    auth_agent _auth;
    talk_agent _talk;    
    
    client () : _net(_j), _auth(_j), _talk(_j) 
    {
    }
};
app::on_init
{
    _client._net.set_delegat( net_handler() ); // наследник net::result
    _client._auth....
    _...
}


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


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


pattern`щик
****


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

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



Цитата(mes @  23.11.2010,  03:38 Найти цитируемый пост)
различное поведение между клиентами обусловнено различной обработкой результата..
т.е. если предполагаются более одного типа клиента, то result должен быть полиморфным.. 

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


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


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

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



Цитата

а кто такой result? 

Цитата

Код

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(); }
   };
   
};



Добавлено @ 04:00
result все таки нехорошо вытягивать наверх.. так как его интерфейс важен для junction
значит нужен еще eventer который будет сообщать об изменении.. 

в итого получилось три уровня :
1. набор  путешествующих структур (передача данных)
2. набор агентов состояния, представляющих клиент
3. и реакция пользователя..

для gui_clienta эти три уровня выливаются в
1. client
2. client_evt
3. form

Добавлено @ 04:02
П.С полиморфность eventera (ту что мы приписывали resultу) может быть в принципе статической.. т.е. в разных приложениях подставлять разную реализацию..

Добавлено @ 04:03
теперь главный вопрос, что мне требуется от дисколи ?


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


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


pattern`щик
****


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

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



Цитата(mes @  23.11.2010,  03:52 Найти цитируемый пост)
теперь главный вопрос, что мне требуется от дисколи ?

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


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


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

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



например для простейшего приложения, мне не нужны агенты... 
Код

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();
   }
};


Добавлено через 5 минут и 9 секунд
итого мне нужно.. чтоб отправленная структура была доставлена нужному методу зарегистрированного объекта.. 
хотелось бы чтоб регистрация была шаблоная и основывалась на списке типов обрабатываемых событий...


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


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


pattern`щик
****


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

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



каждый из этих методов должен вызываться противоположной стороной?
PM WWW   Вверх
mes
Дата 23.11.2010, 04:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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



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


pattern`щик
****


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

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



к примеру on_init() и on_start() не могут вызываться противоположной стороной. это не в их юрисдикции.
PM WWW   Вверх
mes
Дата 23.11.2010, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  23.11.2010,  03:20 Найти цитируемый пост)
каждый из этих методов должен вызываться противоположной стороной? 

кем будет вызываться не важно. зависит от "среза" он может быть замкнут сам на себя..

Добавлено через 2 минуты и 35 секунд
Цитата(boostcoder @  23.11.2010,  03:22 Найти цитируемый пост)
к примеру on_init() и on_start() не могут вызываться противоположной стороной. это не в их юрисдикции. 

естественно... там три "разных типа" методов .. 
Код

   void on_init ()  // вызывается в app
 
   void on_start () // в app
  
   void on_connect () // грубо говоря событие от сокета
 
   void on_auth ()  // событие от server_side
   
   void on_talkmsg () // событие от server_side

   void on_quit() // событие от server_side

   void on_disconnect ()// событие от сокета

   


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


pattern`щик
****


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

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



в общем, в дисколи это реализуется так:
1. пишем метаправило:
Код

struct bot {
   void on_init();
   void on_start();
   void on_connect();
   void on_auth();
   void on_talkmsg();
   void on_quit();
   void on_disconnect();
};

далее..дисколиген из него сгенерирует код, к примеру в файл bot.hpp.
2. Вам нужно в своем коде сделать следующее:
Код

#include <bot.hpp>

struct bot: discoly::impl::i_bot {
   void on_init() {}
   void on_start() {}
   void on_connect() {}
   void on_auth() {}
   void on_talkmsg() {}
   void on_quit() {}
   void on_disconnect() {}
};

реализация методов за вами.
3. нужно добавить этот класс в список реализаций:
Код

typedef boost::mpl::vector<bot> metalist;

4. передать этот тип в клиент или сервер:
Код

discoly::net_client<metalist> client(...);

тогда сервер сможет вызывать ваши методы так:
Код

discoly::net_server<...> server(...);
discoly::ifaces::shared_ptr bot = server.get<discoly::ifaces::bot>();
bot->on_auth();

все.

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


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


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

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



Цитата(mes @  23.11.2010,  03:21 Найти цитируемый пост)
допустим у нас есть struct ident_ok и struct ident_err.. и обработчик принимающий их..

можно сделать proxy класс который будет описывать отношение сообщения к методу обработйчику :
http://liveworkspace.org/code/d12a9c8578db...ca5c7e65a093805

Добавлено через 4 минуты и 21 секунду
Цитата(boostcoder @  23.11.2010,  03:30 Найти цитируемый пост)
далее..дисколиген из него сгенерирует код, к примеру в файл bot.hpp.

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



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


pattern`щик
****


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

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



Цитата(mes @  23.11.2010,  04:37 Найти цитируемый пост)
можно сделать proxy класс который будет описывать отношение сообщения к методу обработйчику

и? что нам это даст?
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.0739 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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