проектирование класса при разборе сетевых пакетов - PullRequest
3 голосов
/ 07 февраля 2012

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

class Header {
public:
   Header(istream &);
   istream& read(istream &);
private:
   uint32_t type;
   uint32_t payload_length;
}

class PayloadTypeA {
public:
   PayloadTypeA {}
   istream& read(istream &);
private:
   uint32_t payload_1;
   uint32_t payload_2;
}

class PayloadTypeB {
 ...
}

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

Однако я чувствую, что это решение кажется несколько неуклюжим - мне интересно, есть ли лучшее решение или идиомы дизайна, которым я должен следовать?

спасибо

Оливер

1 Ответ

1 голос
/ 07 февраля 2012

Обычно ваш заголовок выглядит примерно так:

Содержимое в скобках [] - это данные заголовка

[Длина заголовка, Тип данных,] Данные

Если вы хотите, вы можете иметь динамический заголовок (переменной длины):

[Длина заголовка, Количество чанков, Размер чанка 1, Размер чанка2, Размер блока 3 и т. Д., Тип данных,] Данные

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

...