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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проектирование классов сетевого протокола, Нужны идеи 
V
    Опции темы
azesmcar
Дата 9.10.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Добрый день,

Реализую некий сетевой протокол. Получаю я данные в некий буфер (std::vector<unsigned char>), далее их следует привести в божеский вид, т.е. предоставить удобный интерфейс для доступа к данным. Тоже самое с генерацией, предоставить удобный интерфейс для заполнение полей и как-то сконвертировать в буфер. Сейчас рассматриваю два варианта, выделить упаковку/распаковку в отдельный класс и запихнуть эти функции в класс пакета. Проблема в том, что некоторые поля в заголовке не должны меняться пользователем (например Length), а некоторые - должны. Я либо должен предоставить интерфейс для установки Length в классе Packet либо нет. В общем не буду долго писать, хотелось бы услышать свежие идеи, как и как предложить реализовать данную задачу? Запихнуть функции упаковки и распаковки в класс пакета?
Громоздко и нелогично
выделить упаковку и распаковку в отдельный класс?
 А что делать с интерфейсом пакета? Подружить эти классы? Тоже не нравится.

Заранее спасибо.

Это сообщение отредактировал(а) azesmcar - 9.10.2009, 12:30
PM   Вверх
GoldFinch
Дата 9.10.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



сериализация
PM MAIL ICQ   Вверх
azesmcar
Дата 9.10.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(GoldFinch @  9.10.2009,  18:28 Найти цитируемый пост)
сериализация 

А причем тут серилизация? smile о какой серилизации идет речь?
PM   Вверх
jonie
Дата 9.10.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 15
Всего: 118



azesmcar, экземпляров класса вестимо... Делать это, конечно, удобнее отдельным классом (см. boost::serialization).
Начет "не давать юзеру менять" - можно например сделать декоратор над реально содержащим данные классом....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
azesmcar
Дата 9.10.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



jonie

Протокол не я придумал, это стандартный протокол RADIUS. Не думаю что серилизация мне поможет.
Насчет декоратора спасибо, нужно немного обдумать вариант, возможно этот вариант подойдет..позже напишу.

PM   Вверх
GoldFinch
Дата 9.10.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

Репутация: 15
Всего: 26



azesmcar, это когда в класс добавляется метод serialize() где перечисляются поля класса которые надо передать
(или не метод, а свободная функция)
Код

struct VersionCheck : Packet<0x00>
{
    char stuff;
    int XorKey;

    template<class Archive> void serialize(Archive & ar) { ar & stuff & XorKey ; }
};



а потом это запихивается в архив и отправляется по сети, или принимается и читается из архива
Код

    template<class Packet>
    void Send(Packet packet)
    {
        buf_t buf;
        oarchive_t ar(buf);
        ar<<Packet::id<<packet;
        conn.Send(buf);
    }

PM MAIL ICQ   Вверх
azesmcar
Дата 9.10.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



GoldFinch

Я знаю что такое серилизация, я спросил причем тут серилизация..как раз об этом и шла речь что я не хочу добавлять функцию серилизации (у меня написано упаковки) в класс, потому что этой функции там не место, а если это будет свободная функция то ее придеться дружить с классом пакета, весь вопрос в этом.
PM   Вверх
Void
Дата 9.10.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(azesmcar @  9.10.2009,  14:28 Найти цитируемый пост)
Проблема в том, что некоторые поля в заголовке не должны меняться пользователем (например Length), а некоторые - должны. Я либо должен предоставить интерфейс для установки Length в классе Packet либо нет.

Если поле Length (или любое другое служебное поле) зависит только от полезной нагрузки пакета (payload), то оно вообще не имеет права на существование как поле класса. Вовсе не обязательно делать отображение один к одному полей пакета и полей класса. Служебные поля должен вычислять код сериализации и ему для этого должно быть достаточно открытого интерфейса класса.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
azesmcar
Дата 9.10.2009, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(Void @  9.10.2009,  21:41 Найти цитируемый пост)
Если поле Length (или любое другое служебное поле) зависит только от полезной нагрузки пакета (payload), то оно вообще не имеет права на существование как поле класса. Вовсе не обязательно делать отображение один к одному полей пакета и полей класса. Служебные поля должен вычислять код сериализации и ему для этого должно быть достаточно открытого интерфейса класса. 

Но в таком случае весь парсинг полученного пакета возлагается на плечи класса Packet (не парсить же заголовок в одном классе а атрибуты в другом), тогда класс получается немного громоздким и выполняет слишком много функций (серилизация, десерилизация и предоставляет интерфейс для получения данных из пакета).
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.4349 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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