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

Поиск:

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


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


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

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



Цитата(boostcoder @  26.10.2010,  12:26 Найти цитируемый пост)
одно клиента-с-сервером, второе сервера-с-клиентом? так? 

сокет-соединение ? нет одно .. 
остальное еще не прочел

Добавлено @ 13:33
Цитата(boostcoder @  26.10.2010,  12:26 Найти цитируемый пост)
сейчас разделить реализацию сервера и клиента на две части.

я б сказал не так :
есть сокет соединение 
есть rpc соединение 
и само исполнение

естессвенно у каждого модуля(сервер или клинт) своя реализация каждого уровня.. общие только библиотеки.. 

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


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


pattern`щик
****


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

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



..не понимаю..

может обратные вызовы реализовать следующим образом:
у клиента добавить метод типа "set_callback(int id, function)", где id - идентификатор колбэка, function - объект указывающий на функцию/метод на стороне клиента который будет вызываться. т.е. при вызове set_callback() указанный идентификатор регистрируется на сервере. в то время, на сервере добавить метод типа "callback(id, args...)". где id - идентификатор вызываемого на стороне клиента метода. клиент в свою очередь, должен уметь отличать ответы сервера на свои запросы, от вызовов колбэков.

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


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


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

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



Цитата(boostcoder @  26.10.2010,  12:53 Найти цитируемый пост)
как такая идея? 

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

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

struct notice { enum { id = 0 }; };
struct login  { enum { id = 1 }; };
struct quit   { enum { id = 2 }; };
struct ping   { enum { id = 3 }; };
struct pong   { enum { id = 4 }; };

такой набор исполнителей 
Код

struct auth_handler {
     void on_login  (login const&)  { std::cout << ".auth.login" << std::endl; }
     void on_quit   (quit  const&)  { std::cout << ".auth.quit" << std::endl;  }
};

struct pingpong_handler
{
     void on_ping   (ping const&)   { std::cout << ".pp.ping" << std::endl; }
     void on_pong   (pong const&)   { std::cout << ".pp.pong" << std::endl; }
};

struct recipient
{
   void on_notice (notice const&) { std::cout << ".notice" << std::endl; }
   
   auth_handler       auth;
   pingpong_handler   pingpong;
      
};

диспетчера сообщений :
Код

struct idispatcher
{
   virtual void dispatch (recipient& r, void const* raw_msg )=0;
};

#define DEF_DISP(name, typ, func) \
struct name : idispatcher \
{ \
    virtual void dispatch (recipient& r, void const* raw_msg ) \
    { \
       r func (*static_cast<typ const*>(raw_msg)); \
    } \
};
DEF_DISP(login_dispatcher,  login,  .auth.on_login );
DEF_DISP(quit_dispatcher,   quit,   .auth.on_quit );
DEF_DISP(ping_dispatcher,   ping,   .pingpong.on_ping );
DEF_DISP(pong_dispatcher,   pong,   .pingpong.on_pong );
DEF_DISP(notice_dispatcher, notice, .on_notice );


условный сервер приемки сообщений
Код

idispatcher * disp_table[5] = 
{
  new notice_dispatcher,
  new login_dispatcher,
  new quit_dispatcher,
  new ping_dispatcher,
  new pong_dispatcher
};

void dispatch (size_t msg_id, void const* raw_msg )
{
     disp_table[msg_id]->dispatch(g_recipient, raw_msg);
}

отправитель :
Код

template<class T>
void send (T const& msg)
{
    dispatch (T::id, &msg);
}


тестовый пример :
Код

int main ()
{
    send (login());
    send (ping());
    send (pong());    
    send (notice());
    send (quit());
}

и вывод
Цитата

.auth.login
.pp.ping
.pp.pong
.notice
.auth.quit


http://liveworkspace.org/code/5afd22007254...ad429549e89fe69

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



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


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


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

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



Цитата(mes @  26.10.2010,  13:39 Найти цитируемый пост)
сейчас попробую доработать, чтоб одно сообщение могло в нескольких местах отрабатывать..

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



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


pattern`щик
****


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

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



Цитата(mes @  26.10.2010,  14:39 Найти цитируемый пост)
и так у нас есть как клиент так и сервер могут отправлять вызовы
т.е. каждый из них является то отправителем то получателем.. 

знаков препинания не хватает..смысла не понял...

Добавлено через 25 секунд
Цитата(mes @  26.10.2010,  15:05 Найти цитируемый пост)
можно ведь  вместо карты(массива) диспетчеров просто сделать мультикарту.. 

ага

Добавлено через 55 секунд
по остальному - вникаю в суть...
PM WWW   Вверх
mes
Дата 26.10.2010, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  26.10.2010,  14:23 Найти цитируемый пост)
знаков препинания не хватает..смысла не понял...


Цитата(mes @  26.10.2010,  13:39 Найти цитируемый пост)
и так у нас есть:
 как клиент, так и сервер могут отправлять вызовы, т.е. каждый из них является то отправителем, то получателем.. 


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


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


pattern`щик
****


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

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



Цитата(mes @ 26.10.2010,  15:27)
Цитата(boostcoder @  26.10.2010,  14:23 Найти цитируемый пост)
знаков препинания не хватает..смысла не понял...


Цитата(mes @  26.10.2010,  13:39 Найти цитируемый пост)
и так у нас есть:
 как клиент, так и сервер могут отправлять вызовы, т.е. каждый из них является то отправителем, то получателем.. 


Добавлено @ 15:28
т.е. приведенный код будет как на севере, так и на клиенте, только для своих групп сообщений

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


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


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

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



Цитата(mes @  26.10.2010,  14:05 Найти цитируемый пост)
можно ведь  вместо карты(массива) диспетчеров просто сделать мультикарту.. 

или отделить функциональный вызов от диспатчеризации
т.е. вместо макроса DEF_DISP и всего с его участием, пишем что то типа такого :

Код

// библиотечная часть
template<class T>
struct dispatcher : idispatcher

    virtual void dispatch (recipient& r, void const* raw_msg ) 
    { 
       func (r, *static_cast<typ const*>(raw_msg)); 
    }
    dispatcher (..)..
    boost::function<void (*) (recipient&, T const& msg)> func;
};

Код

// пользовательская
register ( dispather<login> 
    ([] (recipient& r, login& msg ) 
    {   
         r      .on_notice(msg);
         r.auth .on_notice (msg);
         ...
    }) 
);

могут быть ошибки.. с лямбдами пока еще не приходилось работать.. 

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


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


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


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

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



вот доработал немного :
http://liveworkspace.org/code/17eb2d53ecbb...5b334c82dbf190e

Добавлено @ 18:11
а вот чистый пример, без классов исполнителей..  
http://liveworkspace.org/code/6e7e20117c85...4e7a337ac958087

Добавлено @ 18:13
вот пока объяснял сам разобрался как происходить должно... 
smile 

если что осталось непонятным, спрашивайте 
smile



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


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


pattern`щик
****


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

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



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

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


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


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

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



Цитата(boostcoder @  26.10.2010,  18:50 Найти цитируемый пост)
последними двумя примерами, вы меня окончательно запутали..

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


Цитата(boostcoder @  26.10.2010,  18:50 Найти цитируемый пост)
я так понял, что сейчас мы решаем ассоциирование команд с разными интерфейсами? или что?

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

Добавлено через 1 минуту и 9 секунд
Цитата(boostcoder @  26.10.2010,  18:50 Найти цитируемый пост)
до этого, я думал что сейчас мы решаем как создавать исполнителей на стороне сервера по запросу клиента.

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

Добавлено через 1 минуту и 49 секунд
Цитата(boostcoder @  26.10.2010,  18:50 Найти цитируемый пост)
а до этого, думал что мы решали каким образом реализовать колбэки.

и это то же.. как подзадачу smile

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


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


pattern`щик
****


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

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



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


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


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


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


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

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



Цитата(boostcoder @  26.10.2010,  19:28 Найти цитируемый пост)
.но дело в том, что я и в правду запутался.

это я понял.. поэтому и написал :
Цитата(mes @  26.10.2010,  19:20 Найти цитируемый пост)
сейчас надо определиться с какой стороны идти..  

вот сижу и думаю, с чего начать, что у вас уже есть, и где возникла  путаница...

Добавлено @ 20:42
ну например клиент может выглядить так :
Код

rpc::socket_connection<my_protocol> connection;
connection.register ([](login_result const& msg){ std::cout <<(msg.ok ?  "login ok  " : "login fail") << std::endl; });
connection << login("boostcoder", "pass");

тут есть вопросы ?

пояснения :
my_protocol  это traits- структура, содержащая список сообщений, допустимых для передачи по соединению.. 
register() - установка делегата
оператор <<  - отправка сообщения в сеть




Цитата(boostcoder @  26.10.2010,  19:28 Найти цитируемый пост)
вы на протяжении всей темы 

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

smile

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


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


pattern`щик
****


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

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



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

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

приоритеты возможно не в том порядке, т.к. возможно одно зависит от другого.

вот.

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


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


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

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



Цитата(boostcoder @  26.10.2010,  19:49 Найти цитируемый пост)
сейчас есть рабочая реализация сервера и клиента, позволяющая декларировать в удобном(абстрактном) для пользователя синтаксисе команды запросов/ответов + генератор всей подноготной необходимой серверу чтоб знать, какая команда с каким обработчиком ассоциирована.


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

Добавлено через 44 секунды
Цитата(boostcoder @  26.10.2010,  19:49 Найти цитируемый пост)
первым и очевидным недостатком текущей реализации является то, что сервер привязан к конкретному классу обработчиков. и не имеет возможности в рантайме их менять/создавать.

т.е. с приемом/передачей одного сообщения у вас проблем нет ?



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


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

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