Буферизованный сжатый поток Переполнение стека

Сервер должен отправить очень большой zip-файл клиенту. Заархивированный файл не может быть сохранен полностью в памяти (слишком большой) или записан на диск (несколько файлов, отправляемых одновременно, могут быть слишком большими для жесткого диска) — он должен быть передан непосредственно клиенту.

Какие-нибудь простые подходы к этому? Из того, что я понял, формат zip имеет CRC в заголовке, так что вы не можете на самом деле передавать поток zip, не создав его полностью …
Если это невозможно сделать с помощью zip-файлов, предложите альтернативный формат. Благодарю.

3

Решение

Ты можешь использовать раздувать/выкачивать потоки, предоставляемые в POCO:

Этот поток сжимает все данные, проходящие через него, используя zlib
алгоритм сдувания. После того, как все данные были записаны в поток,
close () должен быть вызван для обеспечения завершения сжатия.

std::ofstream ostr("data.gz", std::ios::binary);
DeflatingOutputStream deflater(ostr, DeflatingStreamBuf::STREAM_GZIP);
deflater << "Hello, world!" << std::endl;
deflater.close();
ostr.close();

Вы можете перенаправить это ostr в ваш поток TCP.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]