Задачка на интервью. Пакеты

А хотите задачку, которую я даю претендентам на контрактную позицию в нашей команде? Вот она, родимая. Есть библиотечная функция:

char get_byte();

Функция читает байт из некоего соединения. При необходимости, функция ждет, пока не придет очередной байт. По соединению пересылаются пакеты следующего формата: два байта длины, за которыми следует данные. Длина пакета включает в себя заголовок пакета, т.е. те самые два байта.

Формат пакета.

Нужно написать функцию recv, получающую очередной пакет:

size_t recv(char* buf, size_t size);

В buf передается указатель на буфер, куда должен быть записан пакет (полностью, включая заголовок). size указывает размер этого буфера. Функция возвращает полную длину пакета (включая заголовок) если пакет получен успешно. В случае ошибки возвращается 0.

Соединение, по которому пересылаются байты, не имеет помех. Посылающая сторона ведет себя хорошо и не подсовывает мусор. Функция recv вызывается на границе пакетов. Других потоков нет. Исключений нет.

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

comments powered by Disqus