Day3_beast實現http server

蓝色的海嗷發表於2024-05-27

一、繫結和監聽連線

  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();

相關文章