![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
всем доброго дня.
имеем тип T:
в runtime мы получаем id`ы. хочу реализовать что-то вроде типозависимого прокси callable`ра(хз как правильно назвать). сигнатура методов/объектов такая:
нужна возможность регистрировать методы/объекты имея в runtime только id, и ин compile_time T::id. т.е. зная T::id ат compile_time и id в runtime, назначать методы/объекты принимающие соответствующие им типы. пример конечного использования:
как-то так... запутался, и ничего в голову не лезет... Это сообщение отредактировал(а) boostcoder - 3.4.2011, 01:58 |
||||||
|
|||||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
IMHO сие невозможно. Либо id должен быть известен в compile time, либо реализация proxy вообще не должна зависеть от id Либо я не понял требования задачи - что с чем и по каким признакам надо связать? Во что должен развернуться
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
это разные числа , или одно и то же ? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
если id == type1::id, то должен произойти вызов method1(...) int id имеет диапазон type1::id ... typeN::id два уточнения: 1. typeN::id - это enum. так что можно использовать в mpl. 2. у всех typeN общий предок. Это сообщение отредактировал(а) boostcoder - 6.10.2010, 17:21 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
было б лучше если б дали немного сведений и о задачи, а именно какие требования предъявляются к рантайм..
вот на полусне : http://liveworkspace.org/code/c8cf16a805aa...0bc837af0545038 в том хоть направлении ? Добавлено через 3 минуты и 27 секунд это Вы удаленный вызов реализуете ? Добавлено через 5 минут и 19 секунд а что ж тогда не объект класса typeN передается ? |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
в параметрах должны быть типы или значения соответствующих типов? -------------------- qqq |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так же удобство структуры в возможности легкой (мета ориентированной) регистрации ,
т.е. для неперегруженных функций достаточно только передать имя функции :
подправленная версия : http://liveworkspace.org/code/3b42cd08948e...84cf01e63c3374e |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
можно упаковывать полученные аргументы в boost::any
а методы оборачивать во что-то шаблонное, унаследованное от общего интерфейса (который и принимает эти boost::any) Добавлено через 55 секунд (правда, не получится пользоваться неявными преобразованиями) -------------------- qqq |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
в примере обработчиками выступают функции, но у конечному пользователь захочется иметь что либо более универсальное..поможет класс Dispatchera, для конвертации параметра и класс функции (напр boost::function)
http://liveworkspace.org/code/09b6daf1e59d...aee0c15a1aff76d на "ляпы" не относящиеся к сути проблемы (такие как неподходящий способ хранения) внимания не обращать |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
кстати вспомнил, goldfinch одно время на форуме разбирал темы связанные с удаленными вызовами..
не помню к чему он там конкретно пришел, но думаю Вам будет тематически полезно ознакомиться с этим материалом.. если найдете прикрепите ссылки к теме, плиз |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я даже аккаунта такого не могу найти. и функцию поиска аккаунтов тоже :( пока курю ваш пример. хочется автоматизировать это все. написать кодогенератор на препроцессоре - не проблема. но есть несколько неудобных моментов. думаю... Это сообщение отредактировал(а) boostcoder - 9.10.2010, 03:12 |
|||
|
||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, сделал так, как вы предложили:
используется это дело так:
метод proxy_caller::call() вызывается из сетевой части после того, как буфера на которые ссылается proxy_caller заполнены. как видно из реализации метода methods_dispatcher::dispatch(), ответ отправляется обратно при выходе из тела этого метода. не худшая реализация RPC из тех что я видел но хочется большего. а именно: скрыть от юзера все, кроме самого implementation. в идеале, цель хочу видеть такой:
но тут есть непонятка... т.к. клиент, всего лишь дергает методы сервера, ему их реализация не нужна. но она нужна серверу. вот и непонятка: что на самом деле нужно на стороне клиента, чтоб дергать методы сервера? и что нужно знать серверу, чтоб понять, какой именно метод вызывает клиент? |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну проще было искать тему, и поставить ограничение по юзеру.. вобщем вот об этой я говорил : http://forum.vingrad.ru/forum/topic-269086...tml#st_0_view_0 Это сообщение отредактировал(а) mes - 9.10.2010, 10:53 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
почитал.
но в теме не нашел ничего полезного касательно реализации. а готовое не устраивает по ряду причин, обсуждать которые нет желания. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
да, я тоже прочитал, по старой памяти думал там больше полезного Добавлено @ 11:03 вот например метод login... напишите отдельно, как Вы представляете, клиентскую и серверную часть функционала не затрагивая реализацию rpc, т.е. фактически конечные точки Вашей схемы. Это сообщение отредактировал(а) mes - 9.10.2010, 11:05 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, а что именно описать? как это все происходит сейчас? или что?...
метод login - просто метод. вызывая его на стороне клиента, его аргументы отправляются на сервер, десериализуются, вызывается назначенный для этого типа запроса обработчик, тот в свою очередь получает дополнительный аргумент по ссылке в который кладет ответ, ответ сериализуется, отправляется клиенту, клиент десериализует его, и возвращает юзеру объект типа ответа. |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
имелся ввиду код взаимодействия.. как Вы его видите.. например так :
Добавлено @ 11:37 это как раз лишнее, так как Это сообщение отредактировал(а) mes - 9.10.2010, 11:45 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
понял.
вот нынешний реальный код на стороне клиента. он даже работает
client::query<>() возвращает смарт-поинтер. Добавлено через 2 минуты и 25 секунд что-то у меня это по удобнее получилось Добавлено через 4 минуты и 21 секунду на стороне сервера, каждый тип команды, ассоциирован с методом обработчиком. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
первое что бросается в глаза, value_type не очень удачное название..
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, почему? как тогда его лучше назвать?
мне многие названия в моем коде не нравятся, наверное фантазии не хватает) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
второе, что у Вас не ассинхронный обмен - так и нужно ?
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
асинхронный до тех пор, пока не вызывается один из методов value_type. иначе, вызывающий поток приостанавливается на время получения ответа от сервера. только еще нужно таймаут прикрутить. Это сообщение отредактировал(а) boostcoder - 9.10.2010, 11:54 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
как не знаю.. просто за value_type уже закрепилось некоторое смысловое значение, которое не совпадает с приведенным применением.. ну например response_type или return_type .. Добавлено через 2 минуты и 36 секунд не до конца понял.. запрос к серверу идет здесь
или здесь ? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
т.е. ассинхронность введена специально ? или все ж так получилось ? Добавлено через 4 минуты и 43 секунды ну так не удивительно.. я то написал спонтанно |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
здесь:
он ставится в очередь на основе boost::thread + asio::io_service + boost::packaged_task<> но при вызове любого из методов результата, вызывается boost::unique_future::get(), который приостанавливает вызывающий цикл. Добавлено @ 12:08 да, специально. Добавлено @ 12:14 хотя в этом есть некоторое не очевидное поведение: если вдруг asio::io_service::run выполнить в нескольких потоках(типа пул потоков), и сделать один запрос к серверу ничего не возвращающий но сохраняющий в объект сессии некоторое значение, и следом за ним сделать запрос получающий это значение, то может получится так, что второй запрос придет на сервер раньше чтоб исключить такую ситуацию, в тип нужно добавить служебный метод, что-то типа wait(). сделаю... позже.. Добавлено @ 12:19
Это сообщение отредактировал(а) boostcoder - 9.10.2010, 12:20 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
собственно сейчас меня интересует, каким образом можно авторегистрировать методы-обработчики на стороне сервера, учитывая такую структуру:
http://liveworkspace.org/?id=bb4bddf94368b...b96872fa347ec98 connection - объект сессии с клиентом. Это сообщение отредактировал(а) boostcoder - 9.10.2010, 21:13 |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
интуитивно напрашивается такой псевдо-код :
где rpc это шаблонная структура обертка, отвечающая за отправку запроса клиенту, ожидание и предоставления доступа к результату. Добавлено через 3 минуты и 6 секунд
не приглядывался но мне кажется вы хотите, чтоб у сервера на все пакеты были перегруженные функции с одним именем.. тогда вам поможет список_типов.. Это сообщение отредактировал(а) mes - 9.10.2010, 12:41 |
||||
|
|||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
для этого, нужен метагенератор, генерирующий метаинформацию из к примеру, такого макроса:
если принять за правило соответствие деклараций методов в этом макросе и в реализации этого класса на стороне сервера, то задача кажется вполне выполнимой. т.е. для этого интерфейса должна быть такая реализация:
есть идеи? Добавлено через 4 минуты и 44 секунды вариант. еще вариант, сделать так, чтоб ожидание происходило в деструкторе типа ответа. т.к. он в смарт-поинтере, если мы не приаттачились к нему, то в деструкторе ждать.
нет. на каждый тип команды свой метод обработчик на сервере. |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
в данном случае не понял идеи чего нужны... как из макроса генерить описание серверного обработчика ? сообщение про список типов видели ? если приведете функции обработчики к одному имени, то выгадаете (не кодогенеруеммую, а шаблонную) автоматизацию естественно разный, но с таким же именем )) Это сообщение отредактировал(а) mes - 9.10.2010, 12:56 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я не очень представляю, что именно макрос должен сгенерировать, чтоб без реализации на стороне клиента слинковать программу, а на стороне сервера понять что к чему и как вязать. Добавлено через 2 минуты и 48 секунд что имеется в виду? Добавлено через 5 минут и 26 секунд имена у них тоже разные:
Это сообщение отредактировал(а) boostcoder - 9.10.2010, 12:55 |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
у буста что то в этом роде :
ну а сервер выглядит так
|
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
т.е. вы предлагаете решение, в котором для идентификации методов используется список типов аргументов? я правильно Вас понял?
неудобно тем, что имена одинаковые. разобрать аргументы метода на список типов, и собрать их обратно - не проблема. проблема именно в имени метода. |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
фактически именем метода будет выступать имя типа пакета.. а чем неудобно одинаковое имя ? Добавлено через 51 секунду
да список типов будет определять какие обработчики предоставляет сервер. Добавлено через 1 минуту и 58 секунд
а вот разбирать ничего не надо.. типы должны задаваться интерфейсом, который вы кодогенерируете.. Добавлено через 2 минуты и 50 секунд не обязательно напрямую, возможно через прослойку, только внешне не видную. Добавлено через 4 минуты и 56 секунд сейчас еще одна идея пришла... надо обдумать.. |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
имел в виду их и разобрать. пока не представляю, что должно генерироваться на стороне клиента, чтоб прога скомпилилась.. на стороне сервера - понятно, из сгенерированного кода берется информация необходимая для связывания указателя на объект реализации интерфейса с которым должна связываться. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
клиент заканчивается отправкой сериализированного объекта в _сокет_. Добавлено через 1 минуту и 30 секунд хотя да.. я забыл что еще ответ надо ждать.. вот тут есть проблемка... |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
угу. но вроде как можно приблизительно так(мысли в слух): на стороне клиента, сгенериный интерфейс используется совместно с классом client<interface> на стороне сервера, сгенериный интерфейс используется совместно с классом server<interface> то что генерится, должно содержать в себе какое-то значение времени компиляции которое client<> и server<> будут читать, то можно реализовать их таким образом, чтоб каждый брал для себя только то, что ему нужно. клиенту, на самом деле, нужны эти методы реализованными, но тело этих методов должно посылать запрос на сервер, содержащий в себе помимо самого запроса, еще и информацию идентифицирующую запрос. тогда сервер сможет понять чего от него хотят. серверу, нужна полная реализация, методы которой, вызываются из оберток. как-то так... |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
даже не так... получается так, что оба используют сгенериный интерфейс только для того, чтоб иметь дополнительную информацию о вызове. к примеру:
и возвращаемся к старому вопросу: 1. что должен генерировать метагенератор на стороне клиента? 2. что должен генерировать метагенератор на стороне сервера? 3. как связать сгенерированную информацию с реальным, написанным нами, классом? |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
тоже мысли вслух..
у нас есть запрос мы отправляем его серверу, от него получаем ответ.. тут нужна гарантия определения к какому запросу этот ответ 1. либо у нас строгая очередность, и нет следующего запроса пока не получет ответ. имхо, не имеет смысла 2. запрос сохраняется и выделяется уникальный нумер операции т.е. тогда возможны два запроса подряд одного типа. 3. каждый вид запроса может существовать только в единственном экземпляре.. но тут опять видна несогласованность, ответ может придти на предыдущий запрос, который мы отменили.. Добавлено через 4 минуты и 45 секунд насчет сервера... у нас есть некий компонент, который локально выполняет некую работу.. мы должны определить связку между запросом и компонентом.. т.е. на каждый тип запроса у нас должен быть бинд забирающий инфу откомпонента.. по идеи значит надо для диспетчера создать таблицу лямб функций возвращаюших ответ, на запрос.. Добавлено через 5 минут и 18 секунд ну так и получается, что имя функции нам не нужно.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так и запланировано. выше, я просто привел пример, каким образом можно получить неочередность. а так как запросы живут в одном io_service, то все они выполняются строго в том порядке, в каком были добавлены в очередь. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
кстати при подобной архитектуре сервер получается пассивным, т.е. сообщает только ту информацию которую запросил клиент..
однако судя по названиям некоторых типов Вы разрабатываете нечто вроде чата/игры.. В подобных случаях очень часто бывает необходимость, о сообщение клиенту деталей без его запроса.. |
|||
|
||||
| boostcoder |
|
||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да. я понимаю, что можно запросам присваивать ID`ы. но это пока не главный вопрос. Добавлено через 3 минуты и 18 секунд
да.
можно реализовать следующим образом: в client<> добавить deadline_timer, который сам будет слать серверу запросы, и при получении ответов, вызывать некоторый обработчик. но и это не главное.
|
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
имхо вопрос не с той стороны задан.. для начала нужно представить модель, а как потом это все запихнуть в кодогенерацию дело техники Добавлено через 39 секунд т.е. для начала надо представить как будет выглядить код.. Добавлено через 1 минуту и 17 секунд итак Вы решили (с чем я не согласен) что синхронность будет удобнее.. Добавлено через 2 минуты и 12 секунд тогда у нас есть rpc::client, к которому мы можем посылать запросы и получать ответ Добавлено через 3 минуты и 48 секунд выполнение запроса все равно будет проходить в паралельном потоке, поэтому мы можем чем нибудь себя занять, но при этом должны уметь контролировать состояние запроса .. Добавлено через 4 минуты и 44 секунды тогда при отправке запроса, мы должны получить некую структуру контроллера-наблюдателя.. Добавлено через 8 минут и 32 секунды допустим это будет выглядить так :
Добавлено через 9 минут и 45 секунд отвлекемся на сервер .. |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
сервер хранит модель и список клиентов (сокетов) которые хотят ее изменить..
объект сервера выступает своего рода контроллером этих взаимодействий тогда
Добавлено @ 21:16 теперь нам необходимо как то зарегистрировать функции можно сделать массив/карту делегатов и связать их, Добавлено @ 21:21 а можно отделить внутренности сервера от методов обработчиков .. тогда вместо методов обработчиков определяем таблицу вызовов и тогда регистриуемая функция будет иметь вид
естественно вместо самих функций моно использовать лямбды.. но чтоб не сбиваться идем простым путем.. Это сообщение отредактировал(а) mes - 9.10.2010, 21:23 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
итого значит сервер представлен у нас списком клиентом, контекстом/моделью/сессию (что нагляднее) и таблицей "виртуальных " функций..
заполнять таблицу и задавать модель должен разработчик, сам сервер должен быть представлен библиотекой, ну а таблица по идеи генериться кодогенератором .. Добавлено @ 21:30 итого значит у нас есть rpc::server и rpc::client (не пустать с rpc::server::client ) осуществляющие связь посредством сырых данных и взаимодействующие с пользователем типизированным пакетами. Добавлено @ 21:36 т.е общий код выглядит так
Добавлено через 9 минут и 58 секунд писал rpc::login но по сути пакеты должны находится в другом неймспейсе, например название протокола.. Добавлено через 11 минут и 7 секунд все.. вроде свои мысли высказал.. Это сообщение отредактировал(а) mes - 9.10.2010, 21:36 |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот как я вижу модель:
в данный момент, для каждого входящего соединения(т.к. клиенты сначала подключаются к серверу), создается объект, указанный в типе шаблона сервера. таким образом, получается так, что каждый клиент общается со своим собственным объектом. при завершении сеанса, объект удаляется. есть еще вариант, инициализировать объект сервер, ссылающимся на общий для всех клиентов объект. в таком случае, так как объект реализует кодер, то синхроннизация/разделение_доступа ложится на него.
тогда, в дополнение, было бы мегаудобным, реализовать в классе client<> запрос, типа create_session<type>(). который будет на стороне сервера создавать объект сессии, и переключать контекст клиента на этот объект. если пойти немного дальше, то класс server<> можно реализовать так, чтоб список шаблонных аргументов был переменным. в таком случае, клиент, может делать запросы на создание какого-то конкретного объекта сессии, и пользоваться им.
но это все потом. сейчас первостепенный вопрос в том, какие данные должен генерировать кодогенератор чтоб клиент и сервер могли автосвязывать запросы/ответы с методами/реализацией? Это сообщение отредактировал(а) boostcoder - 10.10.2010, 01:58 |
||||
|
|||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
но насколько я понял, у вас к примеру есть комнаты, в которые могут зайти разные клиенты, а значит сессия (или ее контекст) не у каждого своя а разделяемая(shared).
детали реализации действительно лишние.. как удобнее сделать, будет видно при кодировании.. главное разобраться с сутью взаимоотношений.
на мой взгляд достаточно только генерации пакетов, и списка типов пакетов. клиент и сервер должны быть целыми (не кодогенерируемыми) шаблонами. Добавлено @ 09:39 список типов определяет какими сообщениями они могут обмениваться, а также для для сервера служит основой для таблицы регистрации.. Добавлено @ 09:44 как выглядит пакет и какие данные он должен содержать зависит от клиента и сервера.. поэтому имхо первостепенный вопрос стоит не в кодогенераторе, а в проектирование конечных точек соединения.. при том для упрoщения можно реализовывать в одной проге и передавать данные напрямую, как в начале темы через функции типа void call(id, void*); Это сообщение отредактировал(а) mes - 10.10.2010, 09:44 |
||||||
|
|||||||
| boostcoder |
|
||||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
сессия - контекст пользователя/соединения. комнаты - некоторые объекты, взаимодействие с которыми происходит посредством сессий.
наверное я вас не понимаю.. поясните пожалуйста. немного пораздумав.. должно получиться как-то так:
сервер:
Это сообщение отредактировал(а) boostcoder - 11.10.2010, 02:39 |
||||||||
|
|||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ловите в упрощенном виде : http://liveworkspace.org/code/bbc75134b93c...914597f9c23e38b
с односторонним обменом клиент->сервер rpc - библиотека конечных точек взаимодействия ptcl -(кодогенерируемый) протокол обмена my_server - оболочка реализующая поведение сервера (может быть определена как неймспейсом, так и классом) ну и в глобальном пространстве условных запуск трех программ, сервера и двух клиентов.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, большое спасибо
сейчас буду разбираться. зы на liveworkspace работает табуляция в коде. еще Ctrl+G, Ctrl+F, Ctrl+R, Ctrl+Z. оцените Это сообщение отредактировал(а) boostcoder - 11.10.2010, 10:53 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
и я еще раз насчет (а)синхронности... мне кажется вместо классического вызова функций с получением ответа, где сервер выступает в пассивной форме,
удобнее было бы воспользоваться системой взаимообмена сообщений, тогда клиент будет обладать такой же таблицей методов, как и сервер а пакеты разделяться на две группы (client_to_server, server_to_client); Это сообщение отредактировал(а) mes - 11.10.2010, 13:45 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да. согласен. это хороший вариант. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
продолжим-с...
что у меня есть сейчас:
этот код генерит метагенератор. юзеру остается унаследоваться от этого класса, и реализовать чистовиртуальные методы. как видно, для каждой команды свой метод обработчик. не плохо.. недостаток в том, что пока что, сервер строго привязан типом шаблона. полагаю, сейчас нужно реализовать динамическое создание классов-обработчиков. идея такая: метегенератору указывать имя метаконтейнера который он должен сгенерить помимо класса. и когда юзер запрашивает создание объекта некоторого типа, сервер в метаконтейнере выискивает этот тип. на этом мои мысли исчерпываются.. mes, вы в теме? Это сообщение отредактировал(а) boostcoder - 25.10.2010, 23:43 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот:
но это плохая реализация. нелепо как-то, в один интерфейс пихать сотни методов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
понял.. Вы о том что у сервера только один исполнитель... ага.. это не то.. но по этому поводу у мя вопрос : исполнители должны иметь каждый свою группу сообщений или некоторые сообщения будут для исполнителей общие ? |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
у каждого свои сообщения + общие. общие, это: я хочу реализовать переброс исключений со стороны сервера клиенту. возможно еще какие-то технические данные. еще момент. проблема с конструкторами исполнителей. каким образом реализовать поддержку аргументов для конструкторов? Добавлено через 2 минуты и 15 секунд сейчас приведу структуру классов для понимания.. Добавлено через 12 минут и 20 секунд
где IF - тип исполнителя. |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
опять на помню, может уговорю пересмотреть контракт с сервером с запрос->ответ, на вызов<->вызов
оставить создание исполнителя на стороне пользователя.. Добавлено через 42 секунды как вариант передавать библиотеке ссылку на фабрику.. Добавлено через 3 минуты и 18 секунд итак для начал нам нужно ограничить проблему.. что мы имеем ? набор некоторых типов данных с ид набор исполнителей нам надо доставить данные нужному/нужным исполнителям.. алсо нужно предусмотреть таблицу соответсвий, желательно статическую по отношению к исполнителям.. |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я пока что не представляю как это должно выглядеть/функционировать.. на самом деле, я понимаю, что то, каким образом сейчас происходит общение - это тупик. но не понимаю я как это должно функционировать поясните плиз ;) да, вариант.. набросаю пример.. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не торопитесь с этим .. Добавлено через 12 секунд сейчас |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
кстати. так же, было бы шикарно, реализовать возможность передавать серверу аргумент для исполнителя при запросе его создания.
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Ваша схема (если убрать все лишнее) выглядит так :
главный недостаток в том, что сервер предоставляет информацию ТОЛЬКО по запросу пользователя.. то есть например сообщения чата, будут читаться только когда пользователь запросит, а сервер должен их хранить все это время... а не тогда когда кто то написал.. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а вот так примерно выглядит схема вызов<->вызов :
Добавлено @ 12:48
не знаю как в там в DCOM, но фактически асинхронные callback`и я и предлагаю.. только вот НЕ с соотношением один вызов один каллбяк ) Это сообщение отредактировал(а) mes - 26.10.2010, 12:50 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
что-то не въезжаю.. откуда на стороне клиента может взяться сервер, и на стороне сервера клиент? кто тогда является сервером?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
правда справедливость названия каллбяков в данном случае условна и зависит от способа рассмотрения..
Добавлено @ 12:52
есть локальный сервер и удаленный Добавлено @ 12:52 с клиентом то же самое ) Добавлено @ 12:59 boostcoder, в общем чтоб не путаться если информация содержится/накапливается на сервере а клиент ее должен считать, то Ваш способ подходит если нужна возможность непосредственного взаимодействия клиента с клиентами или ж просто нужна возможность уведомления от сервера в независимости от запроса клиента то не подойдет. Это сообщение отредактировал(а) mes - 26.10.2010, 12:59 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да, собирался реализовать обратные колбэки от сервера клиенту. так что нужно. т.е. чтоб скомпилить клиентскую сторону, должна быть доступна реализация сервера, и на оборот? я правильно понял? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот например фирма выполняет заказ.. она в этот момент сервер, а заказчик клиент, а когда фирма высылает ему счет для оплаты, то заказчик сервер, а фирма клиент т.е. все зависит от темы рассмотрения.. Добавлено @ 13:11
не совсем так.. клиентский клиент и клиентский сервер, несколько (а может и совершенно) другие чем серверный сервер и серверный клиент Добавлено @ 13:11 все зависит от исполнения.. Добавлено @ 13:14 boostcoder, вот с точки зрения основной идеи вашей программы, (не знаю что там но допустим чат) сервер будет сервером вашего чата, а клиент, клиентом вашего чата, но и тот и другой могут иметь серверы удаленых вызовов.. Это сообщение отредактировал(а) mes - 26.10.2010, 13:15 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
т.е. мне нужно сейчас разделить реализацию сервера и клиента на две части.
сервер: 1. класс с аксэптором слушающим порт(КАСП). 2. класс взаимодействующий с сокетом клиента(КВСК). клиент: 1. класс взаимодействующий с сокетом сервера(КВСС). 2. сериализатор/десериализатор команд(СДК). мысли в слух.. на стороне сервера создаем объект КАСП и СДК. КАСП используется по назначению, в то время, как СДК используется для реализации обратных вызовов клиента. на стороне клиента создаем объект КВСС и КВСК. КВСС используется по назначению, в то время, как КВСК используется запутался.. Добавлено через 55 секунд в таком случае, нужно два соединения? одно клиента-с-сервером, второе сервера-с-клиентом? так? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
сокет-соединение ? нет одно .. остальное еще не прочел Добавлено @ 13:33 я б сказал не так : есть сокет соединение есть rpc соединение и само исполнение естессвенно у каждого модуля(сервер или клинт) своя реализация каждого уровня.. общие только библиотеки.. Это сообщение отредактировал(а) mes - 26.10.2010, 13:36 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
..не понимаю..
может обратные вызовы реализовать следующим образом: у клиента добавить метод типа "set_callback(int id, function)", где id - идентификатор колбэка, function - объект указывающий на функцию/метод на стороне клиента который будет вызываться. т.е. при вызове set_callback() указанный идентификатор регистрируется на сервере. в то время, на сервере добавить метод типа "callback(id, args...)". где id - идентификатор вызываемого на стороне клиента метода. клиент в свою очередь, должен уметь отличать ответы сервера на свои запросы, от вызовов колбэков. как такая идея? |
|||
|
||||
| mes |
|
||||||||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
и так у нас есть как клиент так и сервер могут отправлять вызовы т.е. каждый из них является то отправителем то получателем.. поставленная задача: распределять сообщения по исполнителям.. на тек момент одно сообщение, один исполнитель.. предполагается, что набор исполнителей представляют собой один композиционный объект допустим есть такие сообщения :
такой набор исполнителей
диспетчера сообщений :
условный сервер приемки сообщений
отправитель :
тестовый пример :
и вывод
http://liveworkspace.org/code/5afd22007254...ad429549e89fe69 Добавлено через 1 минуту сейчас попробую доработать, чтоб одно сообщение могло в нескольких местах отрабатывать.. |
||||||||||||||
|
|||||||||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
знаков препинания не хватает..смысла не понял... Добавлено через 25 секунд
ага Добавлено через 55 секунд по остальному - вникаю в суть... |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ага. понял... щас.. |
||||
|
|||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
или отделить функциональный вызов от диспатчеризации т.е. вместо макроса DEF_DISP и всего с его участием, пишем что то типа такого :
могут быть ошибки.. с лямбдами пока еще не приходилось работать.. Это сообщение отредактировал(а) mes - 26.10.2010, 15:56 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот доработал немного :
http://liveworkspace.org/code/17eb2d53ecbb...5b334c82dbf190e Добавлено @ 18:11 а вот чистый пример, без классов исполнителей.. http://liveworkspace.org/code/6e7e20117c85...4e7a337ac958087 Добавлено @ 18:13 вот пока объяснял сам разобрался как происходить должно... если что осталось непонятным, спрашивайте Это сообщение отредактировал(а) mes - 26.10.2010, 18:45 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
последними двумя примерами, вы меня окончательно запутали..
я так понял, что сейчас мы решаем ассоциирование команд с разными интерфейсами? или что? до этого, я думал что сейчас мы решаем как создавать исполнителей на стороне сервера по запросу клиента. а до этого, думал что мы решали каким образом реализовать колбэки. и это все за один день Это сообщение отредактировал(а) boostcoder - 26.10.2010, 19:51 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так по сути там то же самое.. просто лишние детали выкорчивались..
да вначале решалась задача как доставить сообщение конкретному исполнителю.. потом встала цель перенаправления одного сообщения нескольким исполнетелям, после чего обнаружилось, что исполнителей как таковых может не быть, как частный случай реализации.. ну а в последнем убрал контекст исполнителей чтоб выделить суть. Добавлено через 1 минуту и 9 секунд
исполнители, это пользовательская часть и серверу она если и нужна, то только для связки с сообщениями.. Добавлено через 1 минуту и 49 секунд
и это то же.. как подзадачу Добавлено через 3 минуты и 24 секунды сейчас надо определиться с какой стороны идти.. |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, я вам очень благодарен..но дело в том, что я и в правду запутался.
если вас не затруднит, опишите пожалуйста, какой вы видите реализацию, словами. для дурака так сказать. очень благодарен вам за то что вы на протяжении всей темы помогаете мне. спасибо. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
это я понял.. поэтому и написал : вот сижу и думаю, с чего начать, что у вас уже есть, и где возникла путаница... Добавлено @ 20:42 ну например клиент может выглядить так :
тут есть вопросы ? пояснения : my_protocol это traits- структура, содержащая список сообщений, допустимых для передачи по соединению.. register() - установка делегата оператор << - отправка сообщения в сеть у меня сейчас похожая задача решается.. так что получилось, что не только Вам, но и себе опыта набираю.. Это сообщение отредактировал(а) mes - 26.10.2010, 20:49 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
сейчас есть рабочая реализация сервера и клиента, позволяющая декларировать в удобном(абстрактном) для пользователя синтаксисе команды запросов/ответов + генератор всей подноготной необходимой серверу чтоб знать, какая команда с каким обработчиком ассоциирована.
первым и очевидным недостатком текущей реализации является то, что сервер привязан к конкретному классу обработчиков. и не имеет возможности в рантайме их менять/создавать. второй недостаток, это то, что нет нормальной реализации обратных колбэков. приоритеты возможно не в том порядке, т.к. возможно одно зависит от другого. вот. |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну для начала нам достаточно одной, двух комманд чтоб проверить в действии. а уж потом, стоит это поднаготную запаковывать Добавлено через 44 секунды
т.е. с приемом/передачей одного сообщения у вас проблем нет ? |
||||
|
|||||
| boostcoder |
|
||||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
под обработчиком подразумеваю это:
т.е. это конечный код генерируемый метагенератором. на стороне сервера используется так:
на стороне клиента:
вот. вроде ничего не упустил. Добавлено @ 21:01 не только одного. многих. вот реальный пример теста:
зы у меня есть приватное SVN хранилище, может быть дать вам доступ? это значительно облегчит понимание. Это сообщение отредактировал(а) boostcoder - 26.10.2010, 21:09 |
||||||||
|
|||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот опять вернулись к самому началу.. вы все время избегаете этого факта..
для создания синхроного запрос/ответ вы идете на искусственные ограничения... если нужна будет синхронность ее лучше организовать внешним слоем... я все ж настаиваю на системе вызов<->вызов, так как с каждой минутой все более уверен, что именно она вам нужна.. мне кажется что Вам просто жаль усилий уже потраченных на кодогенератор, поэтому не хотите взглянуть по сторонам.. Добавлено через 3 минуты и 18 секунд для начала все ж дождусь ответа, готовы ли следовать предложеной схеме и отказаться от своей ? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я ведь не спорю. просто я не могу понять что именно вы подразумеваете под этим. как это должно выглядеть? потому я писал выше, что запутался в задачах. что сейчас нужно изменить в уже имеющемся коде? да нет же. в данный момент, я именно в ступоре. даже не могу понять что делать дальше. Добавлено через 50 секунд да. просто объясните, что и как должно быть? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
у вас есть возможность проверять и клиент и сервер ?
то есть как я понял у Вас есть (если все лишнее выкинуть) фактически пустые клиент и сервер на основе сокетов ? Добавлено @ 21:16 задаю вопросы по частям чтоб не уйти в сторону.. Это сообщение отредактировал(а) mes - 26.10.2010, 21:17 |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да. сейчас это пустой каркас. для тестов, обработчики заполнил хламом:
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
выкиньте хлам.. добавьте две структуры query и result с разными id сделайте два сендера один может отправлять query в сокет, другой result а также два простых получателя, (для каждого по одному сообщению) печатающих допустим id и разместите соответсвенно одну пару на клиенте , другую на сервере.. ничего лишнего, только самое необходимое.. жду (результата или вопросов) Это сообщение отредактировал(а) mes - 26.10.2010, 21:29 |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
т.е. из тела обработчиков? сами обработчики оставить пустыми? в данный момент, структуры(запросы и ответы) генерируются кодогенератором. так:
т.е. код который вы видите выше, генерируется этим макросом. т.е. изменить этот макрос так, чтоб в нем были две структуры? или две команды? команда - состоит из двух структур: 1)запрос, 2)ответ. так как?
на стороне клиента? т.е. создать два объекта типа client? или как? т.е. на сервере один сендер и один получатель? на клиенте так же? |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
без каких либо обработчиков и без применения всего мудренного 5ти строчные объекты.. сейчас времени нет, чуть позже напишу... Добавлено через 31 секунду
ага |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
можно даже не два объекта, а две функции
вот к примеру :
терь нужно оживить это... на клиенте и на севере подобная конструкция чтоб клиент отправлял серверу query, а тот в ответ result.. и еще раз, никаких макросов и кодогенераторов на этом этапе.. Это сообщение отредактировал(а) mes - 26.10.2010, 22:31 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ок. понял. сделаю.
Добавлено через 9 минут и 29 секунд чтение/запись сделать асинхронными? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
если я все верно понял, то вы хотите реализовать запись и чтение в один сокет на каждой стороне? это получится что-то вроде RS-триггера на каждой стороне. т.е. когда клиент записывает в сокет, на стороне сервера получаем событие записи и читаем из сокета. в то время, если сервер пишет, то событие записи получаем на стороне клиента.
все верно? Добавлено через 52 секунды идея |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ага
оказывается проблема сидела глубже чем я думал..
ага я даже боюсь представить как у вас было раньше.. |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
сервер создавал сокет при подключении и ждал записи со стороны клиента. клиент, после того как записал серверу, ожидал записи со стороны сервера |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну в принципе я так и подумал.. просто не смог представить, как вы даже чат на таком реализовывать будете.. ( а по видимым кускам, там нечто по сложнее чем чистый чат) зато хоть все стало становиться на свои места... понятно что вставляло палки в колеса понимания |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да..с проектированием у меня есть проблемы. исправляюсь. читаю умные книжки.
наверное еще пол часика и будет код. |
|||
|
||||
| boostcoder |
|
||||||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот.
даже работает честно признаюсь, я догадывался что оно должно работать именно так, потому и создал на днях эту тему. но что-то меня отвлекло.. сервер:
собирать так:
клиент:
собирать так:
|
||||||||
|
|||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
итак старт положен.. "сырые" данные можете отправлять.. чтоб не путаться назовем объекты этого уровня net_client и net_server.. теперь создаем еще одного clienta, который будет посредством net_client`a отправлять уже типизированные сообщения.. и еще один сервер, который на основе net_servera будет по id в карте вызывать нужный диспетчер для начала диспетчер такого вида :
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
в следующем варианте, и клиент и сервер, изначально должны находится в режиме чтения. так?
зы вот теперь я точно понял идею ) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
речь идет о сокетах ? вообще то должны быть в режиме ожидания, готовые к двусторонней передаче.. т.е как для записи, так и для чтения.. ( я говорю с точки зрения пользователя сокета.. как там внутри я не знаю ) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
т.е. после подключения, клиент и сервер становятся в операцию асинхронного чтения на сокете? полагаю, так логичнее. т.к. изначально мы не зависим от того, кто ведущий а кто ведомый. и любой из них может первым послать пакет.
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вобще-то это уже будет не сервер..а сессия (или удаленный client.. ) но так как у нас (насколько я понял) сервер на одного клиента, то пока пойдет, потом будет виднее где подправить Добавлено @ 16:31 я был против выражения "установлен на чтение", так как тогда логически не возможна запись.. но если не воспринимать буквально, то все верно Добавлено через 3 минуты и 9 секунд
значит все таки столько страниц темы были не напрасны Это сообщение отредактировал(а) mes - 27.10.2010, 16:32 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
к примеру: клиент подключился к серверу. оба читают из сокета.
сервер производит запись. но т.к. клиент ожидает записи в сокет, он читает пакет, снова становится в режим чтения, что-то выполняет с прочитанным пакетом. так? еще любопытно, каким образом можно реализовать пакеты двух типов? т.е. пакеты на которые нужно посылать ответ, и пакеты без ответов? Добавлено через 7 минут и 38 секунд |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
висят себе два сокета никого не трогют, в один написали, друг подал сигнал, и его прочитали.. Добавлено через 30 секунд
никаким образом этого не нужно ( и не придется) делать |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
если я все правильно понял, то вот.
код компилиться, но не завершен, т.к. некоторые моменты не ясны. а именно: 1. клиент, при посылке команды, каким образом будет знать, на какую команду ждать ответа, а на какую нет? 2. серверу, чтоб послать ответ на какую-то команду, так же как и клиенту нужно знать, на какую команду отвечать, а на какую нет. хидер:
реализация:
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
опять )) ничего лишнего ! ) только то что было в задании ) ну ладно .. сервер не посылает ответ, как таковой, он просто принимает команды и работает и побрабатывает их.. если ему когда нибудь (в зависмости от логики обработки, и независимо от приема команды клиента) захочеться послать клиенту команду, он просто ее посылает.. сейчас код гляну Добавлено через 14 минут и 47 секунд посмотрел.. как и предполагалось по вступительным вопросам к коду.. опять вставили свою лепту.. ну в принципе ничего так, только надо вытащить нужное, и избавиться от лишнего.. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
по коду я понял, что у вас предполагается одинаковая база как для сервера, так и для клиента? это жесткая привязка, которая может заставить пользователя писать костыль.. это у Вас моноблок получается.. нехорошо.. к инвокерам претензий в принципе нет |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
пока оставим сервер в покое.. принимает - молодец, с него пока хватит..
(только к клиенту этот подход не применять, и не отходить от нашего нижепредложенного плана ) рассмотрим net_client... нам важны сейчас две его функции , отправки и приема сырых данных.. сырые данные (исходя из кода) у нас выражены как (header&, body&) на клиентена надо добавить два объекта.. rpc_sender и rpc_receiver выглядят так
привязка к net_clientу посредством bind. для проверки можно связать сендер и ресивер непосредственно .. и еще раз ничего лишнего ! фактически только реализовать сендер и привязку.. Это сообщение отредактировал(а) mes - 28.10.2010, 09:17 |
||||
|
|||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это правда. я забежал вперед. просто в момент написания, мне казалось что идею я понял целиком..но когда дошло дело до отправки ответа, я понял, что ничего не понял..
т.е. команды для клиента и сервера разные? не связанные между собой? от чего именно избавится?
это именно тот момент, из-за которого я недописал реализацию. ага. не могли бы вы изменить код приведенный выше, так, чтоб в нем небыло ничего лишнего? т.к. я не очень понимаю что именно я должен сделать.. Добавлено через 1 минуту и 20 секунд по последнему: вроде понял.. Добавлено через 3 минуты и 2 секунды т.е. мой код. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ок.
Добавлено через 3 минуты и 48 секунд по приему данных все ок. в коде сервера, в строке 77, заголовок и тело прочитаны. можно диспетчеризировать. отправку пока оставим в покое я так понял. сейчас клиента доделаю. |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
при простой модели ( точка <-> точка ) команды симметричны т.е. что у одного для отправки у другого для приема.. Добавлено через 4 минуты и 10 секунд
имелось ввиду что не важен сам процесс отправки, и другие функции такие как подключение.. наш rpc_sender с ресивером могут работать в том числе и без сетевого клиента ( если взаимодействие не через сеть).. но это опять забегание вперед, для того чтоб немножко снизить туманость на пути к цели Добавлено через 14 минут и 42 секунды
да, только, чтоб можно было диспатчеризовать кому угодно, и развязать нам руки, вместо _impl поставить делегата |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
код клиента.
только не связал rpc_sender и rpc_receiver, ибо не уверен что все понял..
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Добавлено через 1 минуту и 29 секунд
нет..
Добавлено через 3 минуты и 11 секунд выкидываем пока клиента... а то Вас так прям и тянет в сторону ... Добавлено через 4 минуты и 52 секунды пишем только сендер и ресивер.. связываем выход сендера, со входом ресивера.. при отправке пользователем тпизированного сообщения, ресивер должен распечать его в сыром виде.. Добавлено через 5 минут и 54 секунды т.е связаны должны быть raw_send и dispatch |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот.
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
сейчас да.. после , если захотите избежать лишних копирований, или иметь возможность помещать в очередь ожидания, они пакуются в полиморфный объект (raw_packet) но нам это сейчас лишнее.. Добавлено через 1 минуту и 45 секунд а посмотрел на клиент.. вы не то связали.. raw_send не привязывается к клиенту .. Добавлено через 2 минуты и 17 секунд т.е. не привязывается как хэндлер записи... |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
т.е. код клиента выкидываем, и в main() связываем только два объекта sender и receiver ? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так?
Это сообщение отредактировал(а) boostcoder - 28.10.2010, 12:34 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вобще то так :
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
хорошо.
что дальше? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
теперь к ресиверу нужно добавить таблицу диспетчеров..
где dispacther полиморфно принимает сырой пакет, конвертирует его в нужный тип, и отдает делегату .. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так?
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
опять не совсем.. слишком рано для предположения о передачи типизированного сообщения ресиверу... ресивер это чать rpc, a сообщения должны обрабатываться в пользовательской части ..
Добавлено через 2 минуты и 45 секунд
Это сообщение отредактировал(а) mes - 28.10.2010, 13:11 |
||||
|
|||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
значит так:
не понимаю к чему это сказано.... |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я просто не понимаю к чему это должно привести.. может оказаться так, как уже было... что мы четыре страницы не могли понять друг-друга.. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
сейчас так и происходит..поэтому я частями и даю.. ничего скоро уже должно подойти к цели Добавлено через 1 минуту и 29 секунд добавляем к ресиверу функцию (шаблонную) для регистрации обработчика (сейчас лямбда функции) Это сообщение отредактировал(а) mes - 28.10.2010, 13:22 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ага.
Добавлено @ 13:38 код не компилил. так что использовать как псевдокод. Это сообщение отредактировал(а) boostcoder - 28.10.2010, 13:38 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
как сделаете заводите два сообщения query и result
и вот тестовый пример :
set_handler это reg. Это сообщение отредактировал(а) mes - 28.10.2010, 13:40 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
тут непонятно что использовать как ключ.. или же эту часть должен сгенерировать кодогенератор? Добавлено через 1 минуту и 59 секунд
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
T::id .. не понял вопроса.. кодогенератора у нас нет пока (мы догаваривались же).. все вручную Добавлено @ 13:43
что то не так ? Это сообщение отредактировал(а) mes - 28.10.2010, 13:44 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
отлично Добавлено @ 13:47 как тестовый пример заработает, считайте что главное сделали. Добавлено через 10 минут и 36 секунд как закончите выкладывайте этот примерчик на онлайн-компиляторе.. чтоб можно было визуально оценить куда дальше рельсы класть Это сообщение отредактировал(а) mes - 28.10.2010, 13:49 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
чего то долговато.. там вроде ж у Вас все готово.. или опять чего то лишнее прикручиваете ?
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот: http://liveworkspace.org/code/a372e0ad39ad...d988c17158dc121 что-то компилятор ругается.. Добавлено через 13 минут и 9 секунд не вижу ошибки.. вполне законное связывание.. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
это моя ошибка, в связывании забыты плейсхолдеры Добавлено через 2 минуты и 19 секунд терь не хватает кода сериализации, чтоб увидеть результат.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ы)
http://liveworkspace.org/code/3c9e2679054c...56b18c4669b1ff3 Добавлено через 18 секунд осталось понять почему нет вывода.. Добавлено через 2 минуты и 4 секунды это спешка.. сейчас сделаю.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот: http://liveworkspace.org/code/e41ca2a8c07f...49cabd172c9e0ab
но есть один вопрос не позволяющий завершить код: как быть с meta_dir ? это индикатор направления пакета. Добавлено через 44 секунды убрать пока его? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
чего то вы там хидерами и бодями нахимичили..
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
значит не будет еще с сериализацией разберусь... |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
я думаю сейчас пора убраться от лишних зависимостей реализации.. и объединить хидер с бодом в одном пакете.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
затайпдефить новый тип? Добавлено через 7 минут и 48 секунд вот: http://liveworkspace.org/code/ae95e786e658...dbed5ee67d368e5 осталось понять почему не вызывается invoker::dispatch() .. Добавлено через 12 минут и 2 секунды карта почему-то пустая. хотя зарегано по одному обработчику.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
с этим разобрался: http://liveworkspace.org/code/2da9190f091a...28913d37ff318ba
еще ответ на query не срабатывает Добавлено через 2 минуты и 47 секунд вот. и с этим разобрался: http://liveworkspace.org/code/43a5b1c35f66...9868a3941c5a04b гляньте плиз, я ничего не напутал? можно считать этот код опорной точкой для продолжения? Добавлено через 9 минут и 55 секунд и еще: http://liveworkspace.org/code/f936ac96af0b...80ef89ab01d68e0 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
на вид пока все ок ) не совсем.. нужно избавиться от лишних. зависимостей.. пока эту часть консервируем и делаем от нее ответление.. (вначале все таки упустили, терь придется поправлять) заводим структуру
убираем весь код сериализации в сторону, и вмето хидера_с_бодей ставим нашу структуру.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так же как от нет_клиента избавились зачем с нуля ? сейчас код весь нужный, только неправильно расфасован.. создаете новый файл, перекидываете туда все кроме сериализации и меняете параметры функций на rpc_packet.. нет, грубо говоря сериализацию вынести в другой хидер... Добавлено через 33 секунды сейчас подождите.. я сам сделаю .. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ага. ок. что теперь? Добавлено через 5 минут и 6 секунд кстати, а зачем нам rpc_packet ? или это новый тип взамен хедера и бади? Добавлено через 6 минут и 29 секунд по идее - да. в нем будут локальные буфера и сериализация/десериализация. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
терь надо определиться с пакетом.. какое взаимодействие он должен поддерживать.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так как в планах у нас есть динамическое создание обработчиков(а по мне, так обработчики должны быть методами класса), в нем должен быть идентификатор класса обработчика. так же, можно реализовать передачу служебных сообщений таких как например, исключения
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
минутку не торопитесь... давайте приведем вначале к стартовой точке..
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
т.е. после десериализации пакета, определяем ID класса в котором находится обработчик для команды этого типа. просматриваем карту на предмет наличия этого класса. если есть - берем диспетчера этого класса и передаем ему пакет. если нет - бросить исключение клиенту обратно. Добавлено через 33 секунды мысли вслух... |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
подумав все таки решил, что rpc_packet это бинарный набор данных...
т.е терь возвращаем сериализацию на родину.. только терь она должна внутрь пакета сериализовать.. Добавлено через 28 секунд вы пока с сериализацией мучайтесь, а я пока про ресивер подумаю )) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
и еще invoker нужно занестить в ресивер..
и разгрузить вызов функции инвокера через внешнюю шаблонную функцию.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
в принципе пока не обязательно.. имелось ввиду определить его в пространстве ресивера..
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
сделать две шаблонные функции
внести в них всю работу с сериализацией.. а в сендере, ресивере и, соответственно, инвокере передачу пакета осуществлять по константной ссылке..
Добавлено через 1 минуту и 50 секунд названия не очень удачные.. но если ничего лучше не придет в голову, можно пока так оставить Это сообщение отредактировал(а) mes - 28.10.2010, 19:44 |
||||||
|
|||||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вобще то одно другому не мешает.. покажите что у Вас сейчас |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
я думал вы хоть пакет уже добавили.. Добавлено через 1 минуту и 27 секунд кстати имхо подход не очень верный.. Вы пытаетесь к сериализации добавить пакет... а нужно с другой строны подходить, к пакету добавлять сериализацию так будет легче и яснее ) |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так я не был уверен что все правильно понял. выше написал.
сейчас все будет. |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот вам протипы пакета и пакетных функций..
вся сериализация должна быть в них .. Добавлено @ 20:55 тогда сендер будет выглядить так :
и является теперь не зависимым от устройства рпц_библиотеки с остальным будет также.. это я Вам опять немножко из будущего вытащил Это сообщение отредактировал(а) mes - 28.10.2010, 21:02 |
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
минутку...ща все будет..
на LWS сделал выше область редактора кода, и размер шрифта помельче. вроде как повместительней должно быть. Добавлено через 14 минут и 31 секунду в ней же должны быть и хедер и бади. так? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
да, если нужны.. и как нужны ) Добавлено через 2 минуты и 18 секунд вот я подправил остальное : http://liveworkspace.org/code/baa9b08e0051...92bdb22c903daba Это сообщение отредактировал(а) mes - 28.10.2010, 21:17 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
после можно будет написать класс rpc_receiver2, с инвокерами которые будут вызывать не function, а метод класса..
объект класса будет хранить ресивер.. P.S.старый ресивер не выкидывайте.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
эврика!
http://liveworkspace.org/code/661062d84fc5...cbe28b7e5403890 сейчас еще пересмотрю код. кодировщик/декодировщик заголовка пакета нужно куда-то всунуть. Добавлено @ 22:02 гляньте пожалуйста, может еще что-то найдете ;) Добавлено через 9 минут и 28 секунд навел порядок: http://liveworkspace.org/code/e1be046e609b...44396051e4c81b6 Добавлено через 12 минут и 32 секунды теперь, как я предполагал, rpc_packet::id это идентификатор класса с его обработчиком? Это сообщение отредактировал(а) boostcoder - 28.10.2010, 22:02 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а для чего пакету хидер как буффер ?! сделайте лучше возможность сериализации пакета.. Добавлено через 3 минуты и 14 секунд а paket::body нам тоже не нужен статического размера.. и можно заменить на строку/вектор.. Добавлено через 12 минут и 35 секунд
Это сообщение отредактировал(а) mes - 28.10.2010, 22:41 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
как это подправите, можно считать полученное отправной точкой..
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ок. сейчас..
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
это уровень сети... здесь нам не нужно.. Добавлено @ 23:00 вобщем нужно примерно так :
все остальное (из constants) в мусорку Это сообщение отредактировал(а) mes - 28.10.2010, 23:01 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не дождался , сам подправил :
http://liveworkspace.org/code/aa539e62ca1c...0017fe1a180288b Добавлено @ 23:46 пусть будет здесь, для надежности..
Это сообщение отредактировал(а) mes - 28.10.2010, 23:46 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
теперь осталось сделать контроль пропуска сообщений, чтоб нельзя было отправить чужое сообщение, но уже сейчас можно запихнуть полученое в rpc_parts.h и на этой основе строить клиента..
Это сообщение отредактировал(а) mes - 29.10.2010, 00:25 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
если я ничего не напутал, то здесь ошибочка.
в rpc_pack вы не пакуете идентификатор. но при распаковке пакета, нам не известен его идентификатор, и в функции rpc_unpack вы его не распаковываете. или я опять что-то напутал? |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот что у меня получилось:
http://liveworkspace.org/code/487c740c8d68...d30f827a3ef6efc Это сообщение отредактировал(а) boostcoder - 29.10.2010, 03:11 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
насколько я понимаю, указатели на классы обработчики должны находится в карте клиента и сервера.
но создавать их в конструкторе клиента и сервера - нехорошо.. во первых - жестко завязано. во вторых - это может мешать архитектуре клиента и сервера. мне кажется логичным, создавать классы-обработчики по запросу, как я уже писал. с утра уже.. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот: http://liveworkspace.org/code/e86552b94c95...464261d3bd7d8cf
с обработчиками в виде классов. вот только в данный момент нет возможности из обработчика сделать вызов... Добавлено через 2 минуты и 17 секунд нужно утвердить код, и вынести его в отдельный хидер, а то уже прокручивать палец болит) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
21я строчка в моем последнем наброске а в unpack нам не нужен идентификатор, у нас там уже известен тип Это сообщение отредактировал(а) mes - 29.10.2010, 08:57 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
и все остальное относящееся к этому зачем ?! откуда такие предположения, что при отправки по сети подойдет этот формат.. зачем вобще привязываться к нему.. заче не типозависимые данные паковать в строку ?! и много много еще камней, которым Вы так и пытаетесь забросать ручей логики кода.. Добавлено @ 09:04
вот опять опережаете.. у Вас не сформирован скелет проги, а Вы уже тяжести поднимать заставляете Добавлено @ 09:07
bad_ID будет при проверке среди возможных ид_пакетов.. А так это всего лишь не зарегистрированный handler Добавлено @ 09:11 ну и толку от такой конструкции ? так и в первый ресивер можно было вместо лямбды пробиндить метод с объектом.. Добавлено @ 09:14 утвержденый код (точнее его база) в сообщении предшествующее этому :
Это сообщение отредактировал(а) mes - 29.10.2010, 09:21 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Вы, как клиент, за сервер решили, каким образом ему обрабатывать свои сообщения ?! |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
хорошо.
какая часть того кода остается неизменной, чтоб ее вынести в отдельный файл? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
ок. закинул его в отдельный файл.
далее используем так:
http://liveworkspace.org/code/93eb6d4eba45...fdc9ede71f34864 Это сообщение отредактировал(а) boostcoder - 29.10.2010, 13:15 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
терь в какую строну двигаемся ? готов выслушать пожелания |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
я думаю что пора реализовать возможность создания обработчиков по запросу сторон. нет? Добавлено через 4 минуты и 18 секунд еще момент... пишу.. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |