首页 > 其他分享 >19.6 Boost Asio 文本压缩传输

19.6 Boost Asio 文本压缩传输

时间:2023-11-08 09:11:37浏览次数:37  
标签:Asio 19.6 socket boost base64 result input include Boost

Base64是一种二进制到文本的编码方案,用于将二进制数据转换为ASCII字符串格式。它通过将二进制数据流转换为一系列64个字符来工作,这些字符都可以安全地传输到设计用于处理文本数据的系统中。

如下代码中我们使用Boost中提供的base64_from_binary头文件实现两个函数,其中Base64Decode函数接收一个字符串并对其进行解压缩操作输出解密后的原始字符串内容,其次Base64Encode函数用于将一个原始数据包压缩处理,有了这两个函数的支持,我们只需要在调用发送函数之前对数据进行压缩,在接收数据后在使用对等的函数对其进行解压缩即可,如下是该案例的完整实现。

服务端代码如下所示

#include <iostream>
#include <boost/asio.hpp>

#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>

using namespace std;
using namespace boost::asio;
using namespace boost::archive::iterators;

// base64解密
bool Base64Decode(const string & input, string * output)
{
  typedef transform_width<binary_from_base64<string::const_iterator>, 8, 6> Base64DecodeIterator;
  stringstream result;
  try {
    copy(Base64DecodeIterator(input.begin()), Base64DecodeIterator(input.end()), ostream_iterator<char>(result));
  }
  catch (...) {
    return false;
  }
  *output = result.str();
  return output->empty() == false;
}

int main(int argc, char* argv[])
{
  io_service io_service;
  ip::tcp::acceptor acceptor(io_service, ip::tcp::endpoint(ip::tcp::v4(), 6666));
  ip::tcp::socket socket(io_service);

  acceptor.accept(socket);
  boost::system::error_code error_code;

  // 接受base64加密数据
  char recv_buffer[8196] = { 0 };
  socket.read_some(boost::asio::buffer(recv_buffer, 8196), error_code);
  std::cout << "传输Base64: " << recv_buffer << std::endl;

  // 解密后放入output_str
  string output_str;
  Base64Decode(recv_buffer, &output_str);
  std::cout << "解码后: " << output_str << std::endl;

  std::system("pause");
  return 0;
}

客户端代码如下所示

#include <iostream>
#include <string>
#include <boost/asio.hpp>

#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/binary_from_base64.hpp>
#include <boost/archive/iterators/transform_width.hpp>

using namespace std;
using namespace boost::asio;
using namespace boost::archive::iterators;

// base64加密
bool Base64Encode(const string & input, string * output)
{
  typedef base64_from_binary<transform_width<string::const_iterator, 6, 8>> Base64EncodeIterator;
  stringstream result;
  try {
    copy(Base64EncodeIterator(input.begin()), Base64EncodeIterator(input.end()), ostream_iterator<char>(result));
  }
  catch (...) {
    return false;
  }
  size_t equal_count = (3 - input.length() % 3) % 3;
  for (size_t i = 0; i < equal_count; i++)
  {
    result.put('=');
  }
  *output = result.str();
  return output->empty() == false;
}

int main(int argc, char* argv[])
{
  io_service io_service;
  ip::tcp::socket socket(io_service);
  ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 6666);

  boost::system::error_code error_code;
  socket.connect(ep, error_code);

  // 定义发送变量
  char send_buffer[4096] = { 0 };

  strcpy(send_buffer, "hello lyshark");

  // 加密后放入base64_str
  string base64_str;
  bool ref = Base64Encode(send_buffer, &base64_str);

  // 发送序列化字节序
  socket.write_some(boost::asio::buffer(base64_str, sizeof(base64_str)));

  std::system("pause");
  return 0;
}

运行上述代码片段,读者可看到传输字符串以及解密字符串数据,如下图所示;

标签:Asio,19.6,socket,boost,base64,result,input,include,Boost
From: https://www.cnblogs.com/LyShark/p/17816553.html

相关文章

  • 19.7 Boost Asio 传输序列化数据
    序列化和反序列化是指将数据结构或对象转换为一组字节,以便在需要时可以将其存储在磁盘上或通过网络传输,并且可以在需要时重新创建原始对象或数据结构。序列化是将内存中的对象转换为字节的过程。在序列化期间,对象的状态被编码为一组字节,并可以保存或传输到另一个位置。序列化后的......
  • Daleks' Invasion 题解
    Daleks'Invasion题目大意给定一张无向带权图,对于每条边求一个最大的\(x\),使得将这条边的边权修改为\(x\)后这条边能位于这张图的最小生成树上。思路分析没事干了就把之前写过的题拉出来水题解。我们先把原图的最小生成树求出来,考虑每条边\((u,v)\),分类讨论:如果这条边......
  • 网站顺滑不卡,Booster插件值得更多跨境电商商家选择
    随着电子商务的不断发展,现在的人们对网站的要求也变得越来越高。据Kissmetrics的一项调查数据显示,有47%的人希望网站在2秒钟内打开,网站如果超过3秒还没有动静,那么有40%的人会选择离开。所以对跨境电商商家来说,提高网站打开速度,优化客户使用体验,就显得十分重要了。那么有什么工......
  • 19.10 Boost Asio 同步文件传输
    在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbyelyshark关键词来验证文件是否传输结束了,当然了这种传输方式明显没有根据长度传输严谨,但使用这种方式也存在一个有点,那就是无需确定文件长度,因为无需......
  • 19.10 Boost Asio 同步文件传输
    在原生套接字编程中我们介绍了利用文件长度来控制文件传输的方法,本节我们将采用另一种传输方式,我们通过判断字符串是否包含goodbyelyshark关键词来验证文件是否传输结束了,当然了这种传输方式明显没有根据长度传输严谨,但使用这种方式也存在一个有点,那就是无需确定文件长度,因为无需......
  • 解决xgboost\core.py", ValueError: feature_names may not contain [, ] or <
    解决"xgboost\core.py",ValueError:feature_namesmaynotcontain[,]or<在使用xgboost进行特征工程时,有时会遇到类似下面的错误提示:pythonCopycodeFile"xgboost\core.py",lineXXX,inset_inforaiseValueError('feature_namesmaynotcontain[,]o......
  • GJO-LSTM-Adaboost基于金豺算法优化长短期记忆神经网络LSTM的Adaboost分类预测
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • GJO-BILSTM-Adaboost基于金豺算法优化双向长短期记忆神经网络BILSTM的Adaboost分类预
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 【BiLSTM-Adaboost预测】基于双向长短期记忆网络的Adaboost时间序列预测研究(matlab代
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • centos 6.10 安装 boost 1.78.0
    centos6.10安装boost1.78.0下载地址找到对应的版本,下载源码,而不是二进制文件。解压文件cdboost_1_78_0./bootstrap.sh./b2install-perfix/usr/local/boost1.78.0/......