Day3_beast实现http server

一、绑定和监听连接

  1. 在1CServer.h中声明acceptor, 以及用于事件循环的上下文iocontext,和构造函数
class CServer:public std::enable_shared_from_this<CServer>
{
public:
CServer(boost::asio::io_context& ioc, unsigned short& port); //构造函数
void Start(); //启动服务器
private:
tcp::acceptor _acceptor; //监听器
net::io_context& _ioc; //上下文服务
boost::asio::ip::tcp::socket _socket; //socket
};

实现Star()函数

//功能:启动服务器
//实现一个监听函数,对方来连接,我们就要接收这个连接
void CServer::Start()
{
//伪闭包技术
//我们在防止一些回调函数没有回调过来的时候,怕这个类被析构掉,所以我们先把这个类对象这个this指针生成为一个智能指针
//这个智能跟其他管理这个this指针的智能指针,它们是共享引用计数的,所以采用shared_from_this的方式,而不是直接构造一个智能指针
//如果直接构造智能指针,会出现两个智能指针管理同一个内存区域,就会出现问题
auto self = shared_from_this();
//_acceptor目的:就是接收新连接,接收新连接之后交给HttpConnection去管理
//不管成功还是失败,我们会传这样一个lambda表达式,通过这样一个错误码去绑定。如果成功,返回空,如果出错则非空
_acceptor.async_accept(_socket, [self](beast::error_code ec) {
//因为C++这个网络,尤其是boost::asio,它有的时候,网络出现错误,他不会给你走正常的,可能给你按异常处理
try {
if (ec) //如果出错,就放弃socket连接,继续监听其他连接
{
self->Start();
return;
}
//如果没错误,需要自己去定义一个连接管理类,启动这个连接管理类去处理socket上的所有的读事件/写事件
//创建新连接,并且创建HttpConnection类管理这个类
//Start函数内创建HttpConnection类型智能指针,将_socket内部数据转移给HttpConnection管理,
//_socket继续用来接受写的链接。
std::make_shared<HttpConnection>(std::move(self->_socket))->Start();
//继续监听
self->Start();
}
catch (std::exception& exp) //捕获错误
{
std::cout << "exception is " << exp.what() << std::endl;
self->Start();
}
});
}
  1. 创建新连接,并且创建HttpConnection类管理这个类
    Start函数内创建HttpConnection类型智能指针,将_socket内部数据转移给HttpConnection管理,
    _socket继续用来接受写的链接。
std::make_shared<HttpConnection>(std::move(self->_socket))->Start();
posted @   蓝色的海嗷  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示