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

Поиск:

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


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


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

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



Цитата(boostcoder @  29.10.2010,  18:08 Найти цитируемый пост)
это что? 

это опечатка, которая зародилась у меня, а Вы ее подмножили  smile 

Код

 sock.write ( pack.raw.c_str(), pack.raw.size() );   


Цитата(boostcoder @  29.10.2010,  18:12 Найти цитируемый пост)
но вот кто такой id в pack.raw_data

нет такого.. id сырья хранит пакет.. 
smile

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


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


pattern`щик
****


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

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



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


pattern`щик
****


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

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



еще момент..

в классе rpc_sender, в методе send есть такая конструкция:
Код

raw_send(rpc_pack<T>(o));

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

struct real_sender {
   real_sender(boost::asio::ip::tcp::socket& s, const rpc_packet& o)
      :_socket(s)
   {
      std::array<char, header_size> header;
      sprintf(header.data(), "%04d%06d", o.id, _packet.length());
      std::ostringstream os;
      os << header.data() << o.data;
      _packet = os.str();
   }

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

//
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(real_sender(_socket, rpc_pack(o)));
   }

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


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

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

так сойдет?

Добавлено через 25 секунд
гляньте пожалуйста, с отправкой пакета все гуд?

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


для того, чтоб мы могли протестировать взаимодействие сетевой части в одном процессе, нужно выполнять asio::io_service::run в потоке. так что не удивляйтесь тому, что в классе клиента и сервера добавятся потоки.


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


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


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

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



сейчас гляну..

а Вам если хотите отвлечься , посмотрите набросок :
http://liveworkspace.org/code/16a8c06a8c47...a16e5f2977fb7f6
на грязь не обращайте.. это черновик..


обратите внимание на класс distributor, и в особенности как идет доставка контролерам клиента.. 
 smile

Добавлено через 5 минут и 26 секунд
Цитата(boostcoder @  29.10.2010,  19:30 Найти цитируемый пост)
т.к. у нас сетевое взаимодействие асинхронное, нам нужно класть объекты в очередь пока они не "пошлются"

ага.. 

Цитата(boostcoder @  29.10.2010,  19:30 Найти цитируемый пост)
struct real_sender {
   real_sender(boost::asio::ip::tcp::socket& s, const rpc_packet& o)

ну если эта оболочка которая будет добавлена в очередь, то она не sender a holder.. 
а если это сендер, то он должен брать сообщение из очереди, а не хранить его.. 

сейчас дальше гляну..

Добавлено через 7 минут и 43 секунды
Цитата(boostcoder @  29.10.2010,  19:30 Найти цитируемый пост)
struct rpc_sender {
   rpc_sender(boost::asio::ip::tcp::socket& s):_socket(s) {}

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

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

Добавлено через 11 минут и 31 секунду
Цитата(boostcoder @  29.10.2010,  19:30 Найти цитируемый пост)
но вот с приемом пакетов есть нюанс.. объект, выполняющий чтение пакета, должен "оповещать" класс rpc_receiver о том, что пакет пришел. для этого, в него нужно передать указатель на метод или функциональный объект.

да в любом случае он должен иметь ссылку, только вот на ресивер?, или все таки бинд к методу клиента?.

Добавлено через 14 минут и 1 секунду
Цитата(boostcoder @  29.10.2010,  19:30 Найти цитируемый пост)
для того, чтоб мы могли протестировать взаимодействие сетевой части в одном процессе,

вижу что тот простой трюк ( с биндами ) понравился smile
 smile  smile

Добавлено через 14 минут и 39 секунд
вроде все просмотрел.. если не на все ответил, уточните smile


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


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


pattern`щик
****


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

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



Цитата(mes @  29.10.2010,  20:35 Найти цитируемый пост)
ну если эта оболочка которая будет добавлена в очередь, то она не sender a holder.. 
а если это сендер, то он должен брать сообщение из очереди, а не хранить его.. 

этот объект хранит в себе буфер который нужно послать. по этому, эти объекты мы кладем в очередь.

Цитата(mes @  29.10.2010,  20:35 Найти цитируемый пост)
она не sender a holder.. 

в контексте программирования это как переводится?

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

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

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


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


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

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



Цитата(boostcoder @  29.10.2010,  19:51 Найти цитируемый пост)
в контексте программирования это как переводится?

держатель 


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


pattern`щик
****


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

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



Цитата(mes @  29.10.2010,  20:35 Найти цитируемый пост)
только вот на ресивер?, или все таки бинд к методу клиента?.

мне кажется на ресивер. т.к. именно ресивер содержит карту инвокеров и метод dispatch()
его нужно вязать к rpc_receiver::dispatch(rpc_packet const& pack)

Добавлено через 1 минуту и 9 секунд
Цитата(mes @  29.10.2010,  20:53 Найти цитируемый пост)
держатель

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

Добавлено через 1 минуту и 35 секунд
сейчас ваш код усваивать буду..
PM WWW   Вверх
mes
Дата 29.10.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  29.10.2010,  19:51 Найти цитируемый пост)
этот объект хранит в себе буфер который нужно послать. по этому, эти объекты мы кладем в очередь.

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

Добавлено через 1 минуту и 22 секунды
Цитата(boostcoder @  29.10.2010,  19:54 Найти цитируемый пост)
сейчас ваш код усваивать буду.. 

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

Добавлено через 2 минуты и 56 секунд
Цитата(boostcoder @  29.10.2010,  19:54 Найти цитируемый пост)
т.к. он и держатель буфера который нужно отправить, и отправитель.

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



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


pattern`щик
****


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

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



Цитата(mes @  29.10.2010,  20:55 Найти цитируемый пост)
почему не хранить объекты в очереди, а объекту давать ссылку на очередь..

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


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


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

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



Цитата(boostcoder @  29.10.2010,  19:54 Найти цитируемый пост)
и метод dispatch()
его нужно вязать к rpc_receiver::dispatch(rpc_packet const& pack)

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



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


pattern`щик
****


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

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



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

значит holder

Добавлено через 2 минуты и 34 секунды
Цитата(mes @  29.10.2010,  21:01 Найти цитируемый пост)
заставлять делегата расшифровывать не хорошо.. так как могут потрбоваться знания которыми обладает только клиент..

нужен еще один тип? расшифровщик?
тогда нужен и шифровщик, который сейчас у меня в конструкторе real_sender
PM WWW   Вверх
mes
Дата 29.10.2010, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  29.10.2010,  20:00 Найти цитируемый пост)
почему не хранить объекты в очереди, а объекту давать ссылку на очередь..

поясните.. 

и даже не на очередь а на клиента.. 
и он даже не сендер , а write_action 

интуитивно лезет что от типа такого :
Код

struct write_action
{
    void operator () (..)  { if (m_client.has_what()) m_client.push_out_one(sock);

     ... & m_client;
};

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

Добавлено @ 21:07
Цитата(boostcoder @  29.10.2010,  20:02 Найти цитируемый пост)
нужен еще один тип? расшифровщик?
тогда нужен и шифровщик, который сейчас у меня в конструкторе real_sender 

скорее не типы, а функции, на подобиe pack/unpack 

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

Добавлено @ 21:18
Цитата(mes @  29.10.2010,  20:06 Найти цитируемый пост)
интуитивно лезет что от типа такого :

а клиент после отправки асио объекта с ссылкой, может быть уверен, что объект не будет жить дольше клиента ?


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


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


pattern`щик
****


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

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



Цитата(mes @  29.10.2010,  21:06 Найти цитируемый пост)
а клиент после отправки асио объекта с ссылкой, может быть уверен, что объект не будет жить дольше клиента ?

в деструкторе io_service`а все объекты которые еще лежат в очереди будут разрушены.

или я не понял вопроса?

Добавлено через 3 минуты и 18 секунд
Цитата(mes @  29.10.2010,  21:06 Найти цитируемый пост)
и даже не на очередь а на клиента.. 
и он даже не сендер , а write_action 

интуитивно лезет что от типа такого :
код C++
struct write_action
{
    void operator () (..)  { if (m_client.has_what()) m_client.push_out_one(sock);
     ... & m_client;
};

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

тут не понял...
какого типа ссылка на объект m_client?
что подразумевается по словом "клиент" ? и что подразумевается под словом "очередь" ?

Добавлено через 3 минуты и 47 секунд
Цитата(mes @  29.10.2010,  21:06 Найти цитируемый пост)
скорее не типы, а функции, на подобиe pack/unpack 

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

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


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


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

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



Цитата(boostcoder @  29.10.2010,  20:43 Найти цитируемый пост)
в деструкторе io_service`а все объекты которые еще лежат в очереди будут разрушены.

ага..так и предполагал .. 

Цитата(boostcoder @  29.10.2010,  20:43 Найти цитируемый пост)
какого типа ссылка на объект m_client?

net_client



Цитата(boostcoder @  29.10.2010,  20:43 Найти цитируемый пост)
 и что подразумевается под словом "очередь" ?

к примеру стд::очередь рпц_пакетов..

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


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


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


pattern`щик
****


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

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



Цитата(mes @  29.10.2010,  21:55 Найти цитируемый пост)
к примеру стд::очередь рпц_пакетов..

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

io_service и так представляет очередь. сам выполняет объекты которые в очереди. сам удаляет те, которые выполнил. размер очереди ограничивается только ресурсами системы.
зачем нам еще одна очередь?

Добавлено через 2 минуты и 9 секунд
а если мой вариант реал_сендера переделать так, чтоб он не выполнял упаковку рпц_пакета, чем он не устраивает?

Добавлено через 3 минуты и 10 секунд
Цитата(boostcoder @  29.10.2010,  22:00 Найти цитируемый пост)
мой вариант реал_сендера

ну и называть его холдером
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.