1.beast网落库介绍
Beast网络库是一个基于Boost库的C++网络库,特别用于开发高性能的网络应用程序。它提供了一组易于使用的API,主要用于处理HTTP和WebSocket协议,并支持异步操作和多线程处理。
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, //可异步读的流,比如socket
DynamicBuffer& buffer, //动态缓冲区
basic_parser<isRequest>& parser,//解析器,可以理解为读取完消息的格式,一般用请求报格式和响应报文格式就够了
ReadHandler&& handle //回调函数,支持可调用对象,lambda函数,一般函数参数是
//beast::error_code 和std::size_t
)
async_write(
AsyncReadStream& stream, //可异步读的流,比如socket
DynamicBuffer& 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";
}
}
);