Написать класс с интерфейсом:
struct IReceiver
{
virtual void Receive(const char* data, unsigned int size) = 0;
};
на вход которого (через интерфейс IReceiver) блоками различного размера непрерывно поступает поток данных.
Сам поток представляет собой последовательность пакетов двух типов (пакеты идут вперемешку):
0x24
(1 байт), размер последующих бинарных данных в пакете (4-байтовый), сами бинарные данные.- Текстовые данные, заканчивающиеся на
"\r\n\r\n"
.
Как только обнаружен конец пакета, необходимо данные пакета передать потребителю через callback-интерфейс:
struct ICallback
{
virtual void BinaryPacket(const char* data, unsigned int size) = 0;
virtual void TextPacket(const char* data, unsigned int size) = 0;
};
В обе функции за раз передаётся всё содержимое пакета целиком, без заголовков и "\r\n\r\n"
.
Надо иметь в виду, что данные на интерфейс IReceiver поступают произвольными блоками (нет никакой привязки к размерам и границам пакетов). Деление на блоки никак не привязано к делению на пакеты; границы блоков могут быть внутри пакетов, а границы пакетов - внутри блоков.
Класс должен быть как можно эффективнее при следующих условиях:
- средний поток, подаваемый на вход – 500 Мбит/с;
- средняя длина блока входных данных – 1024 байт.
В решении важна простота и читаемость.