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

Поиск:

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


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


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

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



Цитата(boostcoder @  30.10.2010,  18:26 Найти цитируемый пост)
&real_sender::

это опечатка ? чего то в коде такого не вижу..

Добавлено через 1 минуту и 2 секунды
ага там &outgo:: должно быть.. 



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


pattern`щик
****


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

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



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

потому его и не будет. потому что инком получает ссылку на rpc_receiver::rpc_packet
PM WWW   Вверх
mes
Дата 30.10.2010, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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



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


pattern`щик
****


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

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



Цитата(mes @  30.10.2010,  20:42 Найти цитируемый пост)
это опечатка ?

ага. раньше ведь у нас был такой тип smile 
PM WWW   Вверх
mes
Дата 30.10.2010, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  30.10.2010,  19:44 Найти цитируемый пост)
потому его и не будет.

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

Добавлено через 8 минут и 38 секунд
Цитата(boostcoder @  30.10.2010,  18:26 Найти цитируемый пост)
 void dispatch(const rpc_packet& pack) {

Цитата(boostcoder @  30.10.2010,  18:26 Найти цитируемый пост)
  rpc_packet _packet;

кстати вот еще одна логическая нестыковка.. 



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


pattern`щик
****


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

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



Цитата(mes @ 30.10.2010,  20:47)
Цитата(boostcoder @  30.10.2010,  19:44 Найти цитируемый пост)
потому его и не будет.

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

ах да smile 
все исправил.
Код

template<typename F>
struct inkom {
   inkom(boost::asio::ip::tcp::socket& s, F& f)
      :_socket(s)
      f(f)
   {}

   void operator()() {
      boost::asio::async_read(_socket,
         boost::asio::buffer(header.data(), header.size()),
         boost::bind(&inkom::header_is_read, this, boost::asio::palceholders::error)
      );
   }

private:
   void header_is_read(const boost::system::error_code& e) {
      if ( e ) {
         std::cout << "error on sent packet: " << e.message() << std::endl;
      } else {
         size_t id, len;
         sscanf(header.data(), format, &id, &len);
         _packet.id = id;
         _packet.data.resize(len);
         /**  */
         boost::asio::async_read(_socket,
            boost::asio::buffer(_packet.data, len),
            boost::bind(&inkom::body_is_read, this, boost::asio::palceholders::error)
         );
      }
   }

   void body_is_read(const boost::system::error_code& e) {
      if ( e ) {
         std::cout << "error on sent packet: " << e.message() << std::endl;
      } else {
         f(_packet);
      }
   }

private:
   boost::asio::ip::tcp::socket& _socket;
   rpc_packet _packet;
   F f;
   std::array<char, header_size> header;
};

struct rpc_receiver {
   rpc_receiver(boost::asio::ip::tcp::socket& s)
      :_socket(s)
   {
      _socket.get_io_service().post(
         inkom(
            _socket,
            _packet,
            boost::bind(&rpc_receiver::dispatch, this)
         )
      );
   }

   struct i_invoker {
      virtual void dispatch(rpc_packet const &) = 0;
   };
   typedef std::shared_ptr<i_invoker> i_invoker_ptr;

   template<typename T>
   struct invoker;

   void dispatch(const rpc_packet& pack) {
      auto it  = _map.find(pack.id);
      if ( it != _map.end() && it->second )
         it->second->dispatch(pack);
   }

   template<typename T>
   void set_handler(typename invoker<T>::func_t f) {
      _map[T::meta_id] = i_invoker_ptr(new invoker<T>(f));
   }

private:
   boost::asio::ip::tcp::socket& _socket;
   std::map<int, i_invoker_ptr> _map;
};



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


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


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

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



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




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


pattern`щик
****


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

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



Цитата(mes @  30.10.2010,  20:59 Найти цитируемый пост)
у нас получается что инком живет все время

да. пока rpc_receiver::dispatch() не вернет управление.

Цитата(mes @  30.10.2010,  20:59 Найти цитируемый пост)
а оутго, столько сколько запросов на запись  ?

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


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


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

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



Цитата(boostcoder @  30.10.2010,  19:58 Найти цитируемый пост)
все исправил.

думаю не все :
Цитата

(&real_receiver::body_is_read,

 smile 


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


pattern`щик
****


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

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



забыл..
на нужно чтоб rpc_receiver::dispatch() сначала запускал следующую операцию чтения, и лишь потом все остальное свое тело. какой-то костыль...
или же переделать инком так, чтоб он сам себя перезапускал?

Добавлено через 52 секунды
Цитата(mes @  30.10.2010,  21:02 Найти цитируемый пост)
думаю не все :

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


pattern`щик
****


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

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



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


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


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

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



Цитата(boostcoder @  30.10.2010,  20:03 Найти цитируемый пост)
 rpc_receiver::dispatch() сначала запускал следующую операцию чтения, и лишь потом все остальное свое тело.

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

сейчас..

Добавлено через 10 минут и 45 секунд
выкиньте для начала рпц_сендер и рпц_сендер

пусть будет у клиента send(rpc_packet) и on_incom (rpc_packet)
incom берет функциональный объект с ссылкой на on_incom
в оn_incom  пусть просто печается ид пакета ..
в общем все пост-посылки выполняются клиентом..

Добавлено через 11 минут и 4 секунды
Цитата(boostcoder @  30.10.2010,  20:21 Найти цитируемый пост)
ладно. до завтра.. 

пока )

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


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


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


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

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



в частности это :
Цитата(boostcoder @  30.10.2010,  19:58 Найти цитируемый пост)
   _socket.get_io_service().post(
         inkom(
            _socket,
            _packet,
            boost::bind(&rpc_receiver::dispatch, this)
         )
      );
   }

должно находиться в методе клиента... и    boost::bind(&client::on_incom, this)

Добавлено через 20 секунд
остальное в целом пойдет smile

Добавлено через 9 минут и 22 секунды
Цитата(boostcoder @  30.10.2010,  20:03 Найти цитируемый пост)
или же переделать инком так, чтоб он сам себя перезапускал?

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



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


pattern`щик
****


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

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



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


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


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

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



Цитата(boostcoder @  31.10.2010,  09:09 Найти цитируемый пост)
в общем, сегодня, цель - написать клиента и сервера, вместе с сетевым взаимодействием.

 smile 
и как что будет, не забудьте выкладывать smile


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


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


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

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