#c #boost
#c #boost
Вопрос:
В моем проекте сообщения для чтения и записи через сокет сжимаются с помощью фильтров Zlib boost, я хотел бы знать, как сделать то же самое с файлами. какой лучший способ повысить скорость? Сохранить данные в буфере без использования жесткого диска?
У меня возникли проблемы с передачей файлов с помощью boost, поэтому любая помощь и примеры приветствуются.
Я использую следующий код для отправки сжатых сообщений:
std::string data_
std::stringstream compressed;
std::stringstream original;
original << data_;
boost::iostreams::filtering_streambuf<boost::iostreams::input> out;
out.push(boost::iostreams::zlib_compressor());
out.push(original);
boost::iostreams::copy(out, compressed);
data_ = compressed.str();
boost::asio::write(socket_, boost::asio::buffer(data_ 'n'));
Редактировать:
Я хочу знать, как сжать файл без необходимости сохранять сжатую копию в HD. Сохранение ваших байтов непосредственно в буфер и последующая отправка в сокет. Серверная сторона должна получить файл и распаковать
Комментарии:
1. Не могли бы вы подробнее рассказать о том, какие у вас проблемы? Что не работает?
Ответ №1:
Вот самая простая вещь, о которой я могу думать, которая делает то, что, похоже, вы пытаетесь сделать:
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/asio.hpp>
#include <iostream>
int main() {
std::string data_ = "hello worldn";
boost::asio::io_service svc;
using boost::asio::ip::tcp;
tcp::iostream sockstream(tcp::resolver::query { "127.0.0.1", "6767" });
boost::iostreams::filtering_ostream out;
out.push(boost::iostreams::zlib_compressor());
out.push(sockstream);
out << data_;
out.flush();
}
Используйте простой прослушиватель командной строки, например:
netcat -l -p 6767 | zlib-flate -uncompress
Который радостно сообщает «hello world», когда получает данные от клиента c .