В настоящее время я занимаюсь разработкой программного обеспечения на C ++, куда я отправляю и получаю пользовательские пакеты данных. Я хочу анализировать и управлять этими пакетами хорошо структурированным способом. Очевидно, я сначала получаю заголовок, а после этого тело данных. Основная проблема заключается в том, что мне не нравится создавать объект-пакет только с информацией заголовка, а затем добавлять данные тела. Что такое элегантный способ анализа и хранения пользовательских пакетов данных?
Вот примерный пример того, как может выглядеть такой пользовательский пакет данных:
+-------+---------+---------+----------+------+
| Magic | Command | Options | Bodysize | Body |
+-------+---------+---------+----------+------+
(Предположим, магия составляет 4 байта, команда 1 байт, опции 2 байта, размер тела 4 байта, а само тело имеет переменную длину.)
Как бы я проанализировал это без использования сторонних библиотек?
Обычно я бы сказал, что что-то подобное можно сделать для хранения пакетных данных:
#include <array>
class Packet {
public:
explicit Packet(std::array<char, 10> headerbytes);
void set_body(std::vector<char> data);
std::vector<char> get_body();
int8_t get_command();
int16_t get_options();
bool is_valid();
private:
bool valid;
int8_t _command;
int16_t _options;
int32_t body_size;
std::vector<char> _data;
};
Проблема в том, что я сначала предоставляю информацию заголовка, а потом хакерским способом добавляю данные тела. У объекта пакета есть момент времени, когда он доступен в неполном состоянии.
Сначала я получаю заголовок, а после того, как заголовок получен, делается еще один вызов для чтения тела.
Имеет ли смысл иметь экземпляр синтаксического анализатора, который заполняет информацию в объект пакета, только сделать его доступным, как только он содержит всю необходимую информацию? Имеет ли смысл иметь отдельный класс для заголовка и тела? Каков будет лучший выбор дизайна?
Я занимаюсь разработкой на C ++, а для отправки и получения данных через сокеты используется библиотека boost.