基于boost::beast的http服务器(上)

文章目录

  • 1.beast网落库介绍
  • 2.相关类及api
  • 3.异步读写的处理
    • 3.1异步写案例
    • 3.2异步读案例

1.beast网落库介绍

Beast网络库是一个基于Boost库的C++网络库,特别用于开发高性能的网络应用程序。它提供了一组易于使用的API,主要用于处理HTTPWebSocket协议,并支持异步操作和多线程处理。

2.相关类及api

Tcp连接的建立

一个事件循环
boost::asio::io_context
socket
boost::asio::ip::tcp::socket
接收连接器
boost::asio::ip::tcp::accpetor

http的相关类及api

表示HTTP请求,包含请求方法、URL、HTTP头部和可选的请求体:
boost::beast::http::request< boost::beast::http::dynamic_body >
表示HTTP响应,包含状态码、响应头部和可选的响应体:
boost::beast::http::response< boost::beast::http::dyanmic_body >

异步读写
boost::beast::async_read
boost::beast::async_write

3.异步读写的处理

async_read(AsyncReadStream& stream, //可异步读的流,比如socketDynamicBuffer& buffer,  //动态缓冲区basic_parser<isRequest>& parser,//解析器,可以理解为读取完消息的格式,一般用请求报格式和响应报文格式就够了ReadHandler&& handle  //回调函数,支持可调用对象,lambda函数,一般函数参数是//beast::error_code 和std::size_t)
async_write(AsyncReadStream& stream, //可异步读的流,比如socketDynamicBuffer& buffer,  //动态缓冲区,直接用http的响应报文ReadHandler&& handle  //回调函数
)

3.1异步写案例

// 已经有一个已经打开的 socket 和一个设置好的响应报文  
boost::asio::ip::tcp::socket socket;  
beast::http::request<http::dynamic_body> rsp;  // 使用 async_write() 进行异步写入  
beast::async_write(socket, rsp,  [](beast::error_code ec, std::size_t bytes_transferred)  {  // 处理完成后的逻辑  if(!ec)  {  // 写入成功  std::cout << "Wrote " << bytes_transferred << " bytes\n";  }  else  {  // 写入失败  std::cerr << "Error: " << ec.message() << "\n";  }  }  
);  

3.2异步读案例

#include <boost/beast/core.hpp>  
#include <boost/beast/http.hpp>  
#include <boost/asio/connect.hpp>  
#include <boost/asio/ip/tcp.hpp>  
#include <cstdlib>  
#include <iostream>  
#include <string>  namespace beast = boost::beast;  
namespace http = beast::http;  
namespace net = boost::asio;  
using tcp = net::ip::tcp;  // 你有一个已经连接的 socket 和一个用于接收数据的缓冲区  
tcp::socket socket(io_context);  
beast::flat_buffer buffer;  // 异步读取数据  
beast::async_read(socket, buffer,  req, // 准备缓冲区以接收数据  [](beast::error_code ec, std::size_t bytes_transferred)  {  if(!ec)  {  // 读取成功,处理数据  std::cout << "Read " << bytes_transferred << " bytes\n";  //进行其他处理操作,例如分析get请求还是post}  else  {  // 读取失败  std::cerr << "Error: " << ec.message() << "\n";  }  }  
);  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浪子易支付最新增加订单投诉版源码

此版本增加了订单投诉功能&#xff0c;和一个好看的二次元模板。

【Python实战因果推断】9_元学习器4

目录 Double/Debiased Machine Learning Double/Debiased Machine Learning Double/Debiased ML 或 R-learner 可以看作是 FrischWaugh-Lovell 定理的改进版。其思路非常简单--在构建结果和治疗残差时使用 ML 模型 结果和干预残差&#xff1a; , 预估&#xff0c;预估 由于 …

进销存 未来发展方向

进销存仓库管理系统正朝着更智能、互联、便捷、协同、环保的方向演进。具体来说&#xff0c;有以下几个显著的发展趋势&#xff1a; 智能化与自动化&#xff1a;系统运用人工智能、机器学习算法进行库存预测、需求规划、补货建议&#xff0c;实现精准库存控制。自动化设备如AG…

Python28-4 KNN近邻算法

KNN&#xff08;K-Nearest Neighbors&#xff09;算法是一种常用的机器学习算法&#xff0c;主要用于分类和回归问题。 1. KNN算法的基本概念 KNN算法是一种基于实例的学习算法&#xff0c;也称为惰性学习&#xff08;Lazy Learning&#xff09;算法&#xff0c;因为它在训练…

51单片机第17步_外部中断

本章重点学习外部中断。 1、外部中断0框图&#xff1a; 2、外部中断1框图&#xff1a; 3、Keil C51中有一些关键字&#xff0c;需要牢记&#xff1a; interrupt 0&#xff1a;指定当前函数为外部中断0&#xff1b; interrupt 1&#xff1a;指定当前函数为定时器0中断&#x…

2 z变换与离散时间傅里叶变换

目录 序列的z变换 z变换的定义 常用典型序列的z变换 序列类型与z变换的收敛域 序列的分类 X(z)的极点与收敛域 单边序列 双边序列 z变换的性质 线性 序列移位 单边序列 双边序列 z域尺度变换 序列乘以n 复共轭序列的z变换 初值定理 终值定理 时域卷积定理 …

Spring事务及其传播机制(二)

目录 1.Transcational详解 1.1 rollbackFor 2事务隔离级别 2.1MySQL事务隔离级别回顾 2.2Spring事务隔离级别 3.Spring事务传播机制 3.1什么是事务传播机制 3.2事务的传播机制有哪些 3.3 Spring 事务传播机制使用和各种场景演示 3.3.1 REQUIRED(加入事务) 3.3.2 REQ…

Cisco交换机配置远程登录

交换机配置远程登录 一、telnet远程登录 Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登录服务的标准协议和主要方式(基于 TCP 的 23 号端口) #使用用户名、密码进行远程登录 Switch>enable Switch#configure terminal #进入vlan 1&#xff0c;一般情况下…

Apache ZooKeeper 简介

介绍 Apache ZooKeeper 是一种分布式协调服务&#xff0c;旨在管理和同步大量分布式应用程序。ZooKeeper 是 Apache 软件基金会下的一个开源项目&#xff0c;它解决了维护分布式应用程序的配置信息、命名、分布式同步和组服务的复杂性。本文探讨了 ZooKeeper 的架构、功能、应…

Kotlin 中处理可能为 null 的类型

Kotlin 中处理可能为 null 的类型 在 Kotlin 中&#xff0c;空指针异常 (NullPointerException) 是一种常见的问题。Kotlin 提供了强大的工具和操作符来处理可能为 null 的类型&#xff0c;不局限于 String。本文将介绍如何在 Kotlin 中处理各种可能为 null 的类型&#xff0c…

商标字体的选择:企业和个人申请注册商标攻略!

对于汉字商标&#xff0c;就会涉及到字体的选择&#xff0c;普推商标老杨也经常看到企业因为文字商标字体侵权收到相关字体公司的律师函&#xff0c;所以商标字体选择上要特别注意。 建议选择可以商用的免费字体&#xff0c;常见的有黑体、宋体等&#xff0c;如果这些字体前面…

基于matlab的可乐标签模板匹配

1 建模思路 1.图像预处理&#xff1a; 如果目标图像和模板图像是彩色的&#xff08;即RGB图像&#xff09;&#xff0c;则将它们转换为灰度图像&#xff0c;以便在单通道上进行匹配。使用rgb2gray函数进行灰度化。 2.获取模板大小&#xff1a; 使用size函数获取模板图像的高…

Static关键字在Java中的多种用途解析

Static关键字在Java中的多种用途解析 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; **1. Static关键字概述 在Java中&#xff0c;static是一个关键字&#…

2000-2022年上市公司数字化转型与绿色创新质量匹配数据(含控制变量)

2000-2022年上市公司数字化转型与绿色创新质量匹配数据&#xff08;含控制变量&#xff09;https://download.csdn.net/download/a519573917/89501000 目录 上市公司数字化转型与绿色创新质量匹配的实证研究 一、引言 二、文献综述 三、实证模型 四、数据来源与描述性统计 …

张量 Tensor

张量 Tensor 张量&#xff08;Tensor&#xff09;是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数&#xff0c;这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 &#x1d45b;&#x1d45b; 维空间内&#xff0c;有  &#x1…

tomcat8.5在windows下运行出现日志中文乱码

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

Linux 2-Vim使用

1 什么是vi及vim&#xff1f; vi是文本编辑器&#xff1b;vim是程序开发工具。 2 vi的几种模式 1 一般模式&#xff1a;vi <fileName> 就进入命令模式&#xff0c;可以删除或者复制粘贴 2 编辑模式&#xff1a;修改内容 3 命令行模式&#xff1a;最下面一行&#xf…

NetSuite Amount正负符号在Saved Search和DataSet中的不同含义

近期在一个项目中碰到Amount取值的Bug&#xff0c;原因是我们的代码中数据源从Saved Search转为了DataSet&#xff0c;由于这个转换导致了Amount的正负值混乱。今天记录一下。 正负号原则 • Saved Search&#xff0c; Amount的正负需要考虑科目类型。 Amount字段根据科目类型…

昇思25天学习打卡营第10天 | 基于MindNLP+MusicGen生成自己的个性化音乐

基于MindNLPMusicGen生成自己的个性化音乐 MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型&#xff08;LM&#xff09;的音乐生成模型&#xff0c;能够根据文本描述或音频提示生成高质量的音乐样本&#xff0c;相关研究成果参考论文《Simple and Controllable …

远程过程调用PRC

简介 远程过程调用&#xff08;Remote Procedure Call, RPC)&#xff0c;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间的子程序&#xff0c;且不需要考虑交互作用的细节。 RPC是一种服务器&#xff0c;客户端模式&#xff0c;是一个通过发送请…