Отправка и получение сжатых файлов с повышением по сокету

#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:

Вот самая простая вещь, о которой я могу думать, которая делает то, что, похоже, вы пытаетесь сделать:

Live On Coliru

 #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 .