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

Поиск:

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


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


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

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



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

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


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


pattern`щик
****


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

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



я тут smile 
в тестовые структуры вписал свойства и сериализацию.
далее..щас прочту новые посты.

Добавлено через 50 секунд
Цитата(mes @  30.10.2010,  14:05 Найти цитируемый пост)
и для теста нашего рпц_соединения на основе асио, нам даже сокет и сервер не нужен

какой-то shared объект использовать?

Добавлено через 6 минут и 8 секунд
у всех тестовых стркутур два свойства: 1) std::string : msg, 2) int : code
в конструкторах порядок такой: (std::string, int)
PM WWW   Вверх
boostcoder
Дата 30.10.2010, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



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

тут все понятно.

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


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


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

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



Цитата(boostcoder @  30.10.2010,  16:06 Найти цитируемый пост)
у всех тестовых стркутур два свойства: 1) std::string : msg, 2) int : code
в конструкторах порядок такой: (std::string, int) 

спс smile

Цитата(boostcoder @  30.10.2010,  16:06 Найти цитируемый пост)
какой-то shared объект использовать?

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

Добавлено через 18 секунд
сейчас дело как раз за ним..

Добавлено через 33 секунды
за асио всмысле.. 



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


pattern`щик
****


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

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



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

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


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


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

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



Цитата(boostcoder @  30.10.2010,  17:54 Найти цитируемый пост)
я уже почти закончил с сокетами. давайте все же доведу эту часть до конца ;) 

а я и не предлагал забрасывать сокеты smile 
я  просто предложил еще один альтернативный вариант smile





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


pattern`щик
****


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

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



гляньте пока класса inkom и outgo
Код

struct outgo {
   outgo(boost::asio::ip::tcp::socket& s, const rpc_packet& o)
      :_socket(s)
   {
      rpc_to_raw(_packet, o);
   }

   void operator()() {
      boost::asio::async_write(_socket,
         boost::asio::buffer(_packet, _packet.length()),
         boost::bind(&real_sender::noop, this, boost::asio::placeholders::error)
      );
   }

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

private:
   boost::asio::ip::tcp::socket& _socket;
   std::string _packet;
};

/** sender */
struct rpc_sender {
   rpc_sender(boost::asio::ip::tcp::socket& s):_socket(s) {}

   template<typename T>
   void send(const T& o) {
      _socket.get_io_service().post(outgo(_socket, rpc_pack(o)));
   }

private:
   boost::asio::ip::tcp::socket& _socket;
};

/***************************************************************************/

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

   void operator()() {
      boost::asio::async_read(_socket,
         boost::asio::buffer(header.data(), header.size()),
         boost::bind(&real_receiver::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(&real_receiver::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;
   rpc_packet _packet;
};

с rpc_sender`ом и outgo вроде все гуд.
а вот с inkom и rpc_receiver`ом не все так гладко. что-то мне кажется что тут оверхеда полно..
PM WWW   Вверх
mes
Дата 30.10.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  30.10.2010,  18:26 Найти цитируемый пост)
а вот с inkom и rpc_receiver`ом не все так гладко. что-то мне кажется что тут оверхеда полно.. 

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

Добавлено через 3 минуты и 19 секунд
не удержался, глянул
Цитата(boostcoder @  30.10.2010,  18:26 Найти цитируемый пост)
   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));
   }


что это за изобретательство в инкоме ?
это не его задача ! 



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


pattern`щик
****


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

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



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


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


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

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



Цитата(boostcoder @  30.10.2010,  19:09 Найти цитируемый пост)
это не в инкоме. это в rpc_receiver 

тогда что socket делает в ресивере ?! 
 smile

Добавлено через 2 минуты и 38 секунд
при получении событии на чтение, вызывается инком, который считывает хидер (или преамбулу) 
и тело, формирует rpc_packet и выбрасывает его .. 

больше ничего ему не нужно.. 



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


pattern`щик
****


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

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



оффтоп
Цитата(mes @  30.10.2010,  14:05 Найти цитируемый пост)
начал ознакомление с буст::асио..  классная вещь - даже лучше , чем я  о ней думал..

еще гляньте блог автора asio: http://blog.think-async.com/
мне особенно понравилась его реализация сопрограмм для использования совместно с asio. на тот случай, если вдруг понадобится имитировать несколько тысяч потоков.

Добавлено через 2 минуты и 28 секунд
Цитата(mes @  30.10.2010,  20:14 Найти цитируемый пост)
тогда что socket делает в ресивере ?! 

ну инкому ведь как-то нужно передать сокет.
ок. переделаю. но все равно в конструктор ресивера нужно передать сокет..

Добавлено через 4 минуты и 14 секунд
сокет все равно нужен. откуда инкомам передавать его?

Добавлено через 5 минут и 41 секунду
у сендера ведь есть сокет. почему его не должно быть у ресивера?

Добавлено через 10 минут и 16 секунд
Цитата(mes @  30.10.2010,  20:14 Найти цитируемый пост)
при получении событии на чтение, вызывается инком

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


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


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

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



Цитата(boostcoder @  30.10.2010,  19:18 Найти цитируемый пост)
у сендера ведь есть сокет. почему его не должно быть у ресивера?

да? я не видел... а ему зачем, можно же связать биндом с нужной функцией ?

Добавлено через 1 минуту и 38 секунд
Цитата(boostcoder @  30.10.2010,  19:18 Найти цитируемый пост)
чтоб получить событие чтения, нам нужно в сервайс впихнуть инком который и вернет rpc_packet в dispatch 

ага.. он будет мостиком, по которому по событию из сокета прибудет наш пакет..

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



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


pattern`щик
****


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

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



так...
конструктор инкома берет три аргумента: 1) сокет, 2) ссылку на rpc_packet(чтоб избежать копирования), 3) функциональный объект который будет выполнен по прочтению rpc_packet

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


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


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

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



из того, что сейчас находится в rpc-rev1.hpp ничего приспосабливать под знания асио не нужно..
если нужно что то, не бойтесь расплодить тип.. их потом легче срезать.. чем один тип разбивать на множество..

Добавлено через 3 минуты и 4 секунды
Цитата(boostcoder @  30.10.2010,  19:37 Найти цитируемый пост)
ссылку на rpc_packet(чтоб избежать копирования), 3) функциональный объект который будет выполнен по прочтению rpc_packet

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

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




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


pattern`щик
****


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

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



Цитата(mes @  30.10.2010,  20:31 Найти цитируемый пост)
глянул на сендер.. Вы решили из за того что он пустой можно его заново переписать..а уже выше говорилось, что он сейчас пустой, дальеше в нем появиться функциональнасть позволающая отправлять только "прорегистированные"данные.. 

хорошо...

сендер мне нужен был чтоб реализовать net_client и net_server. ок. предположим что сендер уже не нужен. кто тогда будет отправлять команды?
еще вчера он был нужен...
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.1039 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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