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 @ 2024-05-27 22:18  蓝色的海嗷  阅读(91)  评论(0)    收藏  举报