Создание сетевого стека
У меня есть задача разработать сетевую систему обмена сообщениями с использованием winpcap. Я пытаюсь создать его с помощью шаблона декоратора. Допустим, существует буфер обертывания класса, называемый DataBuffer. Есть и другие классы, скажем EthernetPacket, IPPacket, TCPPacket/UdpPacket классы, которые являются DataPacket и имеют Datapacket*.
DataPackets класс
{
#pragma region MemberFunctions
общественный:
// функции публичных членов
DataPackets();
Пакеты данных( unsigned int length_i);
виртуальные ~пакеты данных();
void* GetInternalBuffer();
void SetInternalBuffer(Byte*& newBuffer, int buffer_length);
встроенный короткого целого без знака GetBufferLength();
virtual E_DATA_PACKET_TYPE GetDataPacketType() { return m_data_packet_type; }
пакетирование виртуальной пустоты();
защищенный:
// Защищенные функции-члены
virtual void AddHeader();
частный:
// Частные функции-члены
#pragma endregion
#pragma region DataMembers
общественный:
// Члены открытых данных
защищенный:
// Защищенные Элементы Данных
E_DATA_PACKET_TYPE m_data_packet_type;
Байт* m_pData;
частный:
// Частные члены данных
беззнаковое короткое m_nDataLength;
беззнаковое короткое m_packet_count;
#pragma endregion
};
Мое недоумение вот это
1. Является ли это правильным шаблоном, который я использую?
2. когда добавляется заголовок данных каждого слоя, то у меня есть несколько дополнительных байтов, например для TCPHeader 20 байтов, которые необходимо добавить в начале. Для этого мне нужно скопировать заголовок, а затем буфер во внутренний буфер для каждого слоя. Это кажется неэффективным. Есть ли лучший способ?
3. в IP-слое внутренний пакет будет разделен в зависимости от MTU сети. Таким образом,если буфер равен 65504 байтам, то будет 44 пакета IP - уровня. Как с этим справиться?
Что я уже пробовал:
1. В буферный слой данных, оставить заголовок пустым. А в TCP или UDP позже скопируйте заголовок. Здесь проблема заключается в том, что заголовок TCP составляет 20 байт, а заголовок слоя UDP-всего 8 байт. Как с этим справиться?
Я в замешательстве. Пожалуйста помочь