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

Поиск:

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


pattern`щик
****


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

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



под обработчиком подразумеваю это:
Код

struct i_registration_api {
   virtual void user_exists_handler ( user_exists_result&, const user_exists_query& ) = 0;
   virtual void registration_handler ( registration_result&, const registration_query& ) = 0;
   virtual void activation_handler ( activation_result&, const activation_query& ) = 0;
   i_registration_api () {
      _map[0] = i_invoker_ptr( new invoker< i_registration_api, user_exists >(this, &i_registration_api::user_exists_handler ) );
      _map[1] = i_invoker_ptr( new invoker< i_registration_api, registration >(this, &i_registration_api::registration_handler ) );
      _map[2] = i_invoker_ptr( new invoker< i_registration_api, activation >(this, &i_registration_api::activation_handler ) );
   }
   // этот метод дергает сервер. наверное его нужно спрятать от юзера...
   virtual void proxy_call(constants::header_packet& h, constants::body_packet& b) {
      int id = header_coders::decode_header(h).id;
      _map[id]->dispatch(h, b);
   }
private:
   std::map<int, i_invoker_ptr> _map;
};

т.е. это конечный код генерируемый метагенератором.

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

struct registration_api: i_registration_api {
   // реализуем виртуальные методы
   // т.е. юзеру ничего более о внутренностях реализации знать не надо.
   // он всего лишь должен реализовать чистовиртуальные методы. все.
};

server<registration_api> server(...); // все. сервер может работать только с этим типом.


на стороне клиента:
Код

client client(argv[1], std::atoi(argv[2]));

user_exists::result_type ret = client.query<user_exists>("John", "[email protected]");
std::cout << ret->message() << ", " << ret->code() << std::endl;


вот.
вроде ничего не упустил.

Добавлено @ 21:01
Цитата(mes @  26.10.2010,  20:51 Найти цитируемый пост)
т.е. с приемом/передачей одного сообщения у вас проблем нет ?

не только одного. многих.
вот реальный пример теста:
Код

      client client(argv[1], std::atoi(argv[2]));
      while ( true ) {
         user_exists::result_type ret = client.query<user_exists>("John", "[email protected]");
         std::cout << ret->message() << ", " << ret->code() << std::endl;

         registration::result_type ret1 = client.query<registration>("John", "[email protected]");
         std::cout << ret1->message() << ", " << ret1->code() << std::endl;

         activation::result_type ret2 = client.query<activation>("John", "234566534");
         std::cout << ret2->message() << ", " << ret2->code() << std::endl;

      }


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


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


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


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

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



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

я все ж настаиваю на системе вызов<->вызов, так как с каждой минутой все более уверен, что именно она вам нужна..

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

Добавлено через 3 минуты и 18 секунд
Цитата(boostcoder @  26.10.2010,  19:58 Найти цитируемый пост)
не только одного. многих.

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




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


pattern`щик
****


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

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



Цитата(mes @  26.10.2010,  21:09 Найти цитируемый пост)
я все ж настаиваю на системе вызов<->вызов, так как с каждой минутой все более уверен, что именно она вам нужна..

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

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

Добавлено через 50 секунд
Цитата(mes @  26.10.2010,  21:09 Найти цитируемый пост)
готовы ли следовать предложеной схеме и отказаться от своей ? 

да. просто объясните, что и как должно быть?
PM WWW   Вверх
mes
Дата 26.10.2010, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



у вас есть возможность проверять и клиент и сервер ? 
то есть как я понял у Вас есть (если все лишнее выкинуть) фактически пустые клиент и сервер на основе сокетов ?

Добавлено @ 21:16
задаю вопросы по частям чтоб не уйти в сторону.. 

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


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


pattern`щик
****


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

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



Цитата(mes @  26.10.2010,  21:16 Найти цитируемый пост)
у вас есть возможность проверять и клиент и сервер ? 
то есть как я понял у Вас есть (если все выкинуть) фактически пустые клиент и сервер на основе сокетов ?

да.
сейчас это пустой каркас. для тестов, обработчики заполнил хламом:
Код

struct registration_api: i_registration_api {
   virtual void user_exists_handler(user_exists_result& r, const user_exists_query&) {
      r.code = rand()%33;
      r.message = "yes, John already registered " + boost::lexical_cast<std::string>(rand()%13) + " times";
   }

   virtual void registration_handler(registration_result& r, const registration_query&) {
      r.code = rand()%7;
      r.message = "you succesfuly registered";
   }

   virtual void activation_handler(activation_result& r, const activation_query&) {
      r.code = rand()%3;
      r.message = "please check your e-mail";
   }
};


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


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


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

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



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

выкиньте хлам.. 

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

ничего лишнего, только самое необходимое.. 

жду (результата или вопросов) smile



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


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


pattern`щик
****


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

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



Цитата(mes @  26.10.2010,  21:28 Найти цитируемый пост)
выкиньте хлам.. 

т.е. из тела обработчиков? сами обработчики оставить пустыми?

Цитата(mes @  26.10.2010,  21:28 Найти цитируемый пост)
добавьте две структуры query и result с разными id

в данный момент, структуры(запросы и ответы) генерируются кодогенератором.
так:
Код

DECLARE_HANDLER_CLASS(
   // abstract class name
   registration_api,
   // check if user with this nick and email already exists
   ((user_exists, // это команда
      ((query, // это тип запроса
        ((std::string, nick))
        ((std::string, email))
      ))
      ((result, // это тип ответа
         ((int, code))
         ((std::string, message))
      ))
   ))
   // registration query
   ((registration, // это команда
      ((query,
         ((std::string, nick))
         ((std::string, email))
      ))
      ((result,
         ((std::string, message))
         ((int, code))
      ))
   ))
   // activation query
   ((activation, // это команда
      ((query,
         ((std::string, nick))
         ((std::string, code))
      ))
      ((result,
         ((std::string, message))
         ((int, code))
      ))
   ))
)


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

Цитата(mes @  26.10.2010,  21:28 Найти цитируемый пост)
сделайте два сендера один может отправлять query в сокет, другой result

на стороне клиента?
т.е. создать два объекта типа client?
или как?

Цитата(mes @  26.10.2010,  21:28 Найти цитируемый пост)
и размести соответсвенно одну пару на клиенте , другую на сервере..

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

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


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


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

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



Цитата(boostcoder @  26.10.2010,  20:40 Найти цитируемый пост)
т.е. из тела обработчиков? сами обработчики оставить пустыми?

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

Добавлено через 31 секунду
Цитата(boostcoder @  26.10.2010,  20:40 Найти цитируемый пост)
т.е. на сервере один сендер и один получатель? на клиенте так же?

ага smile



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


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


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

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



можно даже не два объекта, а две функции 
вот к примеру :
Код

//client
struct connection_t : socket_evthandler 
{
     template<class T>
     void send ( T const&);
  protected:
      ...
     void receive (..)
     {
          ..
         std::cout << "msg_id" << ..
     }
 private:
  socket_t     socket;
};

терь нужно оживить это...

на клиенте и на севере подобная конструкция 
чтоб клиент отправлял серверу query, а тот в ответ result.. 

и еще раз, никаких макросов и кодогенераторов на этом этапе.. 

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


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


pattern`щик
****


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

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



ок. понял. сделаю.

Добавлено через 9 минут и 29 секунд
чтение/запись сделать асинхронными?
PM WWW   Вверх
boostcoder
Дата 26.10.2010, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



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

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


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


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

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



Цитата(boostcoder @  26.10.2010,  21:40 Найти цитируемый пост)
чтение/запись сделать асинхронными? 

ага smile

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

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

Цитата(boostcoder @  26.10.2010,  21:55 Найти цитируемый пост)
 т.е. когда клиент записывает в сокет, на стороне сервера получаем событие записи и читаем из сокета. в то время, если сервер пишет, то событие записи получаем на стороне клиента.

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




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


pattern`щик
****


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

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



Цитата(mes @  26.10.2010,  23:03 Найти цитируемый пост)
я даже боюсь представить как у вас было раньше..

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


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


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

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



Цитата(boostcoder @  26.10.2010,  22:11 Найти цитируемый пост)
сервер создавал сокет при подключении и ждал записи со стороны клиента. клиент, после того как записал серверу, ожидал записи со стороны сервера   

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

зато хоть  все стало становиться на свои места... понятно что вставляло палки в колеса понимания smile




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


pattern`щик
****


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

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



да..с проектированием у меня есть проблемы. исправляюсь. читаю умные книжки.
наверное еще пол часика и будет код.
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1413 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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