c++ - 使用 boost over socket 发送和接收压缩文件

标签 c++ boost

在我的项目中,通过 socket 读写消息是用 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 中保存压缩拷贝。将字节直接保存到缓冲区中,然后发送到套接字。服务器端必须接收文件并解压

最佳答案

这是我能想到的最简单的事情,它看起来像您正在尝试做的那样:

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 world\n";
    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

当它从 c++ 客户端接收到数据时,它会愉快地报告“hello world”。

关于c++ - 使用 boost over socket 发送和接收压缩文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39908022/

相关文章:

c++ - 如何使用 boost::async_system?

c++ - 头文件中的 static const std::string

c++ - CMake 错误查找 Boost header

c++ - CMake AUTOMOC 文件位于不同的文件夹中

c++ - DXGI 桌面复制屏幕捕获速度

c++ - 仅特化模板函数实现的一部分

c++ - 用户可能无法在 Linux 系统上打开共享内存对象的原因

python - boost/thread.hpp : No such file or directory

c++ - 如何合并两个不同结构的容器( vector/列表),但在 C++ 中有一个公共(public)参数

c++ - 绘制多个立方体时 glGenVertexArrays 和 glGenVertexBuffers 出现问题