Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > универсальный шаблон для описания протоколов


Автор: evkwarrior 7.12.2009, 11:41
ДОброго времени суток, уважаемые форумчане
Возникла такая проблема:
необходимо разработать шаблон (а точнее формат шаблона) для описания протоколов прикладного уровня (http, smtp и т.д.).
в шаблоне должно находиться полное описание протокола (элементы, их характеристики и условия, налагаемые для них)
к примеру, для протокола http шаблон должен включать примерно следующую инфу:
стартовая строка (метод - uri - версия)
заголовки (запросные заголовки (accept, referer и т.д), ответные заголовки, и т.д.)
content-body
+  к этому для каждого элемента протокола условия его применения (запросные заголовки тогда,  когда метод Get или post).

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

я никогда с подобным не сталкивался, и эта задача ставит меня в ступор. я не прошу придумать что-то за меня, а просто хочу спросить совета:
может, кто-то сталкивался с чем-то подобным (разработка шаблонов описания протоколов или файловых форматов) и может поделиться опытом,
или кто-то знает, где копать на эту тему, где почитать.
разработка планируется на C++ в QT или Visual Studio 2008

очень буду признателен, если кто-то поможет

Автор: SenkraD 7.12.2009, 11:59
Может быть http://www.eventhelix.com/realtimemantra/patterncatalog/protocol_layer.htm тебе поможет или подскажет направление мысли

Автор: mes 9.12.2009, 02:01
Цитата(evkwarrior @  7.12.2009,  10:41 Найти цитируемый пост)
программа, обрабатывающая шаблон, не должна ничего знать о том, шаблон какого протокола она обрабатывает. причем важнее больше придумать формат шаблона (метод описания данных).

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


Автор: Любитель 9.12.2009, 02:34
Я правильно понимаю, что нужен просто мегауниверсальный парсер? Описывать тривиально - описываешь список токенов и определяешь токен "весь поток данных". Описание - список из групп термов. Термы - определяем просто допустимый диапазон символов и их количество или же конкретные варианты. Проблема возникает в случае, если формат данных (в той или иной степени) тяжело описать декларативно. Но.. это уже из области экзотики (если делать парсер на разумном виде, без мегапроверок и конкретизаций). Немного сумбурно, но.. в целом верно ))

Автор: chaos 9.12.2009, 10:44
evkwarrior, http://ru.wikipedia.org/wiki/ASN.1

Автор: evkwarrior 9.12.2009, 19:16
спасибо всем, кто откликнулся)

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

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

проблема в том, что для протоколов мало описать только поля. надо описать ещё и алгоритм взаимодействия.
необходимо, чтобы сформированное в конструкторе можно было ещё и отправить по сети. 
некоторые протоколы описывают сеансы, некоторую последовательность действий между подключением и отключением
как быть с некоторыми последовательностями действий - хрен знает.
например для ftp:
>открыли порт 21
<ждем 220
>user "login"
<if 331 continue else repeat
>pass "pass"
<if 230 continue else repeat
>command
<wait for answer
.........
>quit

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

Автор: mes 9.12.2009, 22:54
например винда, даже для расскладки хранит dll, а не некое описание -
так и Вам имхо вместо изобретения шаблона описания, лучше продумать плагинную систему,
возможно Вам будет удобно также прикрутить какой нибудь скриптовый язык для динамичного расширения возможностей плагина.
smile



Автор: chaos 10.12.2009, 09:20
ИМХО очень очень...... сложно разработать универсальную штуку. ибо протоколы упомянутые топикстартером тривиальные, а есть еще всякого рода МЭКи где "черт ногу сломит" не говоря уже об всяких MMS, TASE и тд и тп.

Топикстартеру: делай то что сейчас нужно, не пытайся охватить все!

Автор: evkwarrior 10.12.2009, 13:19
Цитата(mes @  9.12.2009,  22:54 Найти цитируемый пост)
так и Вам имхо вместо изобретения шаблона описания, лучше продумать плагинную систему,

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

Автор: xvr 10.12.2009, 13:41
'некоторые последовательности' можно описать Конечным Автоматом. Условия для переходов между состояниями могут извлекаться из дешифрованных (шаблонами) данных.
Для описания самих шаблонов можно привлечь например XML Schema

Автор: evkwarrior 10.12.2009, 15:16
добавлю.
на другом форуме столкнулся с проблемой непонимания задачи. Мне нужно придумать универсальный ФОРМАТ шаблона, а не универсальный шаблон.
шаблонов будет много, для каждого протокола.
т.е. универсальный протокол описания протоколов)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)