首页 > 其他分享 > beast网络库搭建http服务器

beast网络库搭建http服务器

时间:2023-08-14 19:22:44浏览次数:34  
标签:body http request beast _. 服务器 response

参考:https://llfc.club/category?catid=225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2RlhDCg4eedYme46C6ddo4cKcFN

简介

前面的几篇文章已经介绍了如何使用asio搭建高并发的tcp服务器,以及http服务器。但是纯手写http服务器太麻烦了,有网络库beast已经帮我们实现了。这一期讲讲如何使用beast实现一个http服务器。

连接类

我们先实现http_server函数

  1. void http_server(tcp::acceptor& acceptor, tcp::socket& socket)
    {
    acceptor.async_accept(socket,
    [&](beast::error_code ec)
    {
    if (!ec)
    std::make_shared<http_connection>(std::move(socket))->start();
    http_server(acceptor, socket);
    });
    }

     

http_server中添加了异步接收连接的逻辑,当有新的连接到来时创建http_connection,然后启动服务,新连接监听对端数据。接下来http_server继续监听对端的新连接。
连接类http_connection里实现了start函数监听对端数据

  1. void start()
    {
    read_request();
    check_deadline();
    }

     

处理读请求,将读到的数据存储再成员变量request_中,然后调用process_request处理请求

 

void read_request()
{
auto self = shared_from_this();
http::async_read(
socket_,
buffer_,
request_,
[self](beast::error_code ec,
std::size_t bytes_transferred)
{
boost::ignore_unused(bytes_transferred);
if (!ec)
self->process_request();
});
}

 

check_deadline主要时用来检测超时,当超过一定时间后自动关闭连接,因为http请求时短链接

 

void
check_deadline()
{
auto self = shared_from_this();
deadline_.async_wait(
[self](beast::error_code ec)
{
if (!ec)
{
// Close socket to cancel any outstanding operation.
self->socket_.close(ec);
}
});
}

 

process_request函数中区分请求的类型,进行不同类型的处理如post还是get请求

 

void process_request()
{
response_.version(request_.version());
response_.keep_alive(false);
switch (request_.method())
{
case http::verb::get:
response_.result(http::status::ok);
response_.set(http::field::server, "Beast");
create_response();
break;
case http::verb::post:
response_.result(http::status::ok);
response_.set(http::field::server, "Beast");
create_post_response();
break;
default:
// We return responses indicating an error if
// we do not recognize the request method.
response_.result(http::status::bad_request);
response_.set(http::field::content_type, "text/plain");
beast::ostream(response_.body())
<< "Invalid request-method '"
<< std::string(request_.method_string())
<< "'";
break;
}
write_response();
}

 

create_response函数中解析了不同的路由处理get请求

 

void
create_response()
{
if (request_.target() == "/count")
{
response_.set(http::field::content_type, "text/html");
beast::ostream(response_.body())
<< "<html>\n"
<< "<head><title>Request count</title></head>\n"
<< "<body>\n"
<< "<h1>Request count</h1>\n"
<< "<p>There have been "
<< my_program_state::request_count()
<< " requests so far.</p>\n"
<< "</body>\n"
<< "</html>\n";
}
else if (request_.target() == "/time")
{
response_.set(http::field::content_type, "text/html");
beast::ostream(response_.body())
<< "<html>\n"
<< "<head><title>Current time</title></head>\n"
<< "<body>\n"
<< "<h1>Current time</h1>\n"
<< "<p>The current time is "
<< my_program_state::now()
<< " seconds since the epoch.</p>\n"
<< "</body>\n"
<< "</html>\n";
}
else
{
response_.result(http::status::not_found);
response_.set(http::field::content_type, "text/plain");
beast::ostream(response_.body()) << "File not found\r\n";
}
}

 

create_post_response处理了post请求中的一部分路由

 

void create_post_response() {
if (request_.target() == "/email")
{
auto& body = this->request_.body();
auto body_str = boost::beast::buffers_to_string(body.data());
std::cout << "receive body is " << body_str << std::endl;
this->response_.set(http::field::content_type, "text/json");
Json::Value root;
Json::Reader reader;
Json::Value src_root;
bool parse_success = reader.parse(body_str, src_root);
if (!parse_success) {
std::cout << "Failed to parse JSON data!" << std::endl;
root["error"] = 1001;
std::string jsonstr = root.toStyledString();
beast::ostream(this->response_.body()) << jsonstr;
return ;
}
auto email = src_root["email"].asString();
std::cout << "email is " << email << std::endl;
root["error"] = 0;
root["email"] = src_root["email"];
root["msg"] = "recevie email post success";
std::string jsonstr = root.toStyledString();
beast::ostream(this->response_.body()) << jsonstr;
}
else
{
response_.result(http::status::not_found);
response_.set(http::field::content_type, "text/plain");
beast::ostream(response_.body()) << "File not found\r\n";
}
}

write_response发送请求

void write_response()
{
auto self = shared_from_this();
response_.content_length(response_.body().size());
http::async_write(
socket_,
response_,
[self](beast::error_code ec, std::size_t)
{
self->socket_.shutdown(tcp::socket::shutdown_send, ec);
self->deadline_.cancel();
});
}

 

标签:body,http,request,beast,_.,服务器,response
From: https://www.cnblogs.com/bwbfight/p/17629523.html

相关文章

  • 鸟哥的Linux私房菜服务器架设篇
    第四章:连接到Internet1、主机名十分重要,DNS系统中主机名=ip;如百度服务器主机名为:www.baidu.com2、DHCP(局域网)、DNS(互特网)等都需要服务器来部署,如DHCP服务器可以IP路由器来充当;3、配置ADSL时注意,   a、ppp0拨号成功后,ISP会自动给予ppp0接口一个可以连上internet的defaul......
  • 云服务器几核什么意思
       云服务器几核就是指CPU的大小。CPU是云服务器配置中重要的一个参数,CPU是服务器的中央处理器,是衡量服务器性能的重要指标。那么,云服务器几核够用呢?  如果是一般的中小企业展示型网站、企业官方网站、个人站长的站点等,至少需要云服务器2核。   如果是门户类......
  • 服务器数据恢复-6盘RAID5中2块磁盘故障离线,强制上线硬盘失败的数据恢复案例
    服务器数据恢复环境:DELLPOWEREDGE某型号服务器中有一组由6块SCSI硬盘组建的RAID5阵列,LINUXREDHAT操作系统,EXT3文件系统,存放图片文件。服务器故障&分析:服务器raid5阵列中有一块硬盘离线,管理员没有及时发现,直到服务器raid5阵列中的另一块硬盘掉线,raid5阵列瘫痪,服务器无法正常工......
  • HTTP代理IP在自媒体中的作用有哪些?
    随着自媒体业务的兴起和发展,为更多人提供了一个很好的平台。在自媒体业务中,HTTP代理IP的作用主要有以下几个方面:一、爬虫和数据采集:自媒体从不同的网站抓取数据时,为了避免被网站封禁IP,可以使用HTTP代理IP进行请求,通过不断切换IP地址来绕过网站的限制,实现抓取数据的稳定性。二、流量......
  • 深入解析:HTTP和HTTPS的三次握手与四次挥手
    推荐阅读AI文本OCR识别最佳实践AIGamma一键生成PPT工具直达链接玩转cloudStudio在线编码神器玩转GPUAI绘画、AI讲话、翻译,GPU点亮AI想象空间「java、python面试题」来自UC网盘app分享,打开手机app,额外获得1T空间https://drive.uc.cn/s/2aeb6c2dcedd4AIGC资料包https:......
  • 在安卓模拟器上如何实现HTTP代理自动切换
    在开发和测试应用程序时,有时需要在安卓模拟器上实现HTTP代理的自动切换以方便调试。本文将介绍如何在安卓模拟器上实现HTTP代理的自动切换。1.使用脚本文件使用脚本文件是一种实现HTTP代理自动切换的简单方法。以下是一个示例脚本文件:这个脚本定义了一个代理服务器地址和端口号数组......
  • Windows服务器管理技巧:多用户登录设置、开启防火墙与SSH远程登录配置指南
    WindowsServer服务器管理技巧:对于使用WindowsServer服务器开发人员或者运维人员初学者来说,可能会遇到很多问题,比如:如何设置允许多用户同时登录服务器?如何开启服务器防火墙?Windows如何配置SSH远程登录?等等,如果遇到了这些问题,来看看这篇文章就能解决啦!一、如何设置允许多用户同时......
  • 阿贝云服务器哪个好用免费
    随着云计算技术的发展,越来越多的企业和个人开始寻找一款性价比高且功能全面的云服务器,阿贝云作为一个具备高性能、可靠性、安全性和强大扩展性的云服务器厂商,备受云计算用户们的关注。那么,阿贝云服务器哪个好用免费呢?下面将为大家介绍阿贝云服务器的免费使用情况。一、阿贝云服务......
  • 如何编写定时关机脚本以保护服务器安全
    引言:近期,网络安全备受关注,服务器的安全性成为企业和个人用户日益关注的焦点。为了进一步加强服务器的安全性,定时关机是一种有效的措施。本文将介绍如何编写一个定时关机脚本,并结合定时任务编辑器实现自动关机操作,从而确保服务器在非工作时间段处于关闭状态,减少被攻击的风险。1.......
  • 关于Linux服务器安全加固-禁止被ping扫描探测
    关于Linux服务器上设置禁ping,可以一定程度上在互联网上隐藏自己,防止一些批量扫描软件探测主机,减少被入侵的几率另一方面禁止ping也会增加服务器的防护能力,防止别人使用的大量的恶意ping消耗服务器的网络、cpu等资源 1、关于是否允许被ping,主要是看 /proc/sys/net/ipv4/icmp_......