一、繫結和監聽連線
- 在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();
}
});
}
- 建立新連線,並且建立HttpConnection類管理這個類
Start函式內建立HttpConnection型別智慧指標,將_socket內部資料轉移給HttpConnection管理,
_socket繼續用來接受寫的連結。
std::make_shared<HttpConnection>(std::move(self->_socket))->Start();