реклама на сайте
подробности

 
 
> "Слоеный" протокол, На Си++
Misile_Inc
сообщение Jul 24 2012, 14:25
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 174
Регистрация: 30-08-11
Из: Санкт-Петербург
Пользователь №: 66 926



Здравствуйте! Есть протокол из трех уровней:

1. Физический (physical) - RS-232;
2. Канальный (data link);
7. Прикладной (application);

Уровни 2 и 7 имеют свои механизмы контроля ошибок (CRC, контрольная сумма), механизмы адресации и подтверждений.

Если с физическим уровнем все ясно, то остальные 2 уровня заставили меня задуматься.

Как вы считаете, как наиболее "Красиво" и "Правильно" организовать "Заворачивание" данных сначала в один протокол (Уровень 7), затем другой (Уровень 2) на языке C++ ?

Если не затруднит- с примерами / pattern.

Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
XVR
сообщение Jul 25 2012, 07:10
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



В такой задаче нужно отталкиваться не от ООП принципов, а от самих протоколов и форматов. Если каждый уровень просто 'заворачивает' данные предыдущего уровня в дополнительную обертку, то можно воспользоваться парадигмой объекта - пакета, который может расширяться с 2х сторон обработчиками протокола следующего уровня (это делается просто заказом буфера достаточной длинны и заполнением его начиная с середины).
Каждый уровень протокола так же представлен объектом, из которых выстоен стек. В стеке каждый объект-протокол принимает экземпляр объекта-пакета, добавляет к нему свой пролог и эпилог и передает по стеку дальше

(Приблизительно так сделан стек TCP/IP в Linux'е, если я правильно помню)
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 25 2012, 07:57
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(XVR @ Jul 25 2012, 10:10) *
В стеке каждый объект-протокол принимает экземпляр объекта-пакета, добавляет к нему свой пролог и эпилог и передает по стеку дальше

(Приблизительно так сделан стек TCP/IP в Linux'е, если я правильно помню)


А разве стек TCP/IP линукса сделан на C++?
Да, и какие вы свойства и методы припишите объекту пакета?
Метод послать самого себя? Или свойство дошел или не дошел? И зачем это нужно будет уровням, которые за этим вообще не следят?

В стеке TCP нет понятия пакета внутри реализации. Там есть несколько видов очередей.
Элементами тех очередей в свою очередь являются списки. А вот те списки уже описывают элементы пакета.
Т.е. пакеты могут никогда не представляться одной непрерывной областью памяти.
На физическом уровне пакеты посылаются DMA по связным спискам.
Но хуже того, каждый уровень может оставить в очереди копию фрагмента пакета для последующего быстрого переповтора. Один фрагмент может быть потом приписан нескольким пакетам.
Т.е. если создавать объекты пакетов, то возникнут неявные связи между этими пакетами, что вообще все ООП коту под хвост пошлет.
Вообщем для стека вроде TCP объекты пакетов лишь запутают реализацию.

Go to the top of the page
 
+Quote Post
XVR
сообщение Jul 25 2012, 08:45
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(AlexandrY @ Jul 25 2012, 11:57) *
А разве стек TCP/IP линукса сделан на C++?
Нет, но и на С можно писать в ООП стиле.
Цитата
Да, и какие вы свойства и методы припишите объекту пакета?
Получить доступ к содержимому. Добавить данные в начало. Добавить данные в конец.
Можно взять готовый контейнер - std::deque<char>. Он вполне соотвествует пакету (хотя и несколько избыточен из за своей универсальности)

Цитата
В стеке TCP нет понятия пакета внутри реализации.
Там есть нечто похожее - struct sk_buff с указателями
* @head: Head of buffer
* @data: Data head pointer
* @tail: Tail pointer
* @end: End pointer
data-tail - содержит собственно тело пакета
head-data - место для заголовков, которые могут добавить уровни протокола
и tail-end - место для добавления суфиксов опять же от обработчиков уровней протокола

Цитата
Там есть несколько видов очередей.
Есть, и немало rolleyes.gif
Цитата
Элементами тех очередей в свою очередь являются списки. А вот те списки уже описывают элементы пакета.
Т.е. пакеты могут никогда не представляться одной непрерывной областью памяти.
Пакеты - слишком общее слово. Они бывают самые разные. Те, что в sk_buff - то же пакеты, я имел в виду именно их

Цитата
Вообщем для стека вроде TCP объекты пакетов лишь запутают реализацию.
Я не утверждал, что весь стек TCP построен на таких пакетах, я просто упомянул где я их видел biggrin.gif

А вот подойдет ли этот метод ТС - это вопрос к нему. И он сильно зависит от собственно протоколов, которые ему надо реализовывать (это я тоже писал)
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Jul 29 2012, 15:31
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(XVR @ Jul 25 2012, 12:45) *
Нет, но и на С можно писать в ООП стиле.


Можно подробнее про программирование на С в ООП стиле? желательно с примером
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jul 29 2012, 16:23
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(TigerSHARC @ Jul 29 2012, 19:31) *
Можно подробнее про программирование на С в ООП стиле? желательно с примером


Предыдущую страницу слобо посмотреть ? пример
http://prex.sourceforge.net/src/S/252.html#L48
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Jul 29 2012, 19:12
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(sasamy @ Jul 29 2012, 20:23) *
Предыдущую страницу слобо посмотреть ? пример
http://prex.sourceforge.net/src/S/252.html#L48

спасибо. Не могли бы вы немного объяснить в чём приемущества такого подхода(когда работаем с объектами на С)? пока не понятна сама суть. Просто все объекты кода описываются как структуры
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 29 2012, 20:15
Сообщение #8


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(TigerSHARC @ Jul 29 2012, 22:12) *
спасибо. Не могли бы вы немного объяснить в чём приемущества такого подхода(когда работаем с объектами на С)? пока не понятна сама суть. Просто все объекты кода описываются как структуры


Приведен избитый пример структуры базового драйвера. Написан он так не потому, что хотели изобразить в стиле ООП, а потому что иначе не написать драйвер который может динамически подключаться к прикладным уровням.
Например к файловой системе может быть подключен драйвер NAND Flash, а потом отключен и подключен драйвер SD карты.
Но это показуха, поскольку чуть меняется тип периферии скажем нужен драйвер мультиплексированного канала к внешнему вспомогательному контроллеру, как такая структура драйвера уже не подходит и нужно рядом сочинять другой.
Т.е. полное отсутствие полиморфизма.
Другая проблема в том, что самые интересные функции драйвера скрыты в функциях ioctl и devctl.
Там вообще творится беспредел. Что точно эти функции делают можно понять исключительно просканировав все их исходники сверху донизу.
Это противоположность принципу наследования.
В нормальном ООП подходе места таким функциям нет. Вместо этого должно было быть наследование абстрактных методов от базового драйвера и дополнение уникальными методами.
Вместо этого же имеем ioctl с десятками (если не сотнями) типов аргументов. Браузеры кода можно выкинуть, это самые скверные места в операционках.
И после этого любители линукса говорят, что что-то могут сделать за пять минут. Ну-ну!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Misile_Inc   "Слоеный" протокол   Jul 24 2012, 14:25
- - Ruslan1   Цитата(Misile_Inc @ Jul 24 2012, 17:25) К...   Jul 24 2012, 15:36
- - Misile_Inc   Ruslan1, я старался поставить вопрос несколько глу...   Jul 24 2012, 15:48
|- - kolobok0   Цитата(Misile_Inc @ Jul 24 2012, 19:48) ....   Jul 24 2012, 15:56
|- - AlexandrY   Цитата(kolobok0 @ Jul 24 2012, 18:56) пре...   Jul 24 2012, 16:59
|- - kolobok0   Цитата(AlexandrY @ Jul 24 2012, 20:59) .....   Jul 26 2012, 12:08
- - Misile_Inc   Все же, мне кажется, коня не такого уж и сферичес...   Jul 24 2012, 16:14
|- - AlexandrY   Цитата(XVR @ Jul 25 2012, 11:45) Получить...   Jul 25 2012, 09:10
||- - XVR   Цитата(AlexandrY @ Jul 25 2012, 13:10) Да...   Jul 26 2012, 07:12
||- - AlexandrY   Цитата(XVR @ Jul 26 2012, 10:12) Мое пред...   Jul 26 2012, 08:27
||- - XVR   Цитата(AlexandrY @ Jul 26 2012, 12:27) Го...   Jul 26 2012, 09:53
|||- - AlexandrY   Цитата(XVR @ Jul 26 2012, 12:53) Нет. В о...   Jul 26 2012, 11:05
|||- - XVR   Цитата(AlexandrY @ Jul 26 2012, 15:05) Ну...   Jul 26 2012, 12:22
||- - sasamy   Цитата(AlexandrY @ Jul 26 2012, 12:27) Зд...   Jul 26 2012, 09:53
|- - sasamy   Цитата(AlexandrY @ Jul 30 2012, 00:15) В ...   Jul 29 2012, 22:17
- - Misile_Inc   Спасибо, господа Вашу дискуссию чрезвычайно прият...   Jul 27 2012, 09:27
- - Misile_Inc   Может есть какая - нибудь книга, где бы автор расс...   Aug 2 2012, 14:59


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th August 2025 - 06:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01453 секунд с 7
ELECTRONIX ©2004-2016