BmcWeb是OpenBMC的一個核心模塊,對外負責響應Redfish請求,并且由于OpenBMC的Web使用的Redfish api,所以BmcWeb也是Web的后臺。
1.main函數
//src\webserver_main.cpp
#include "webserver_run.hpp"int main(int /*argc*/, char** /*argv*/) noexcept(false)
{return run();
}
2.main函數調用的run函數
//src\webserver_run.cppint run()
{boost::asio::io_context& io = getIoContext();App app;...
}
//include\io_context_singleton.hppinline boost::asio::io_context& getIoContext()
{static boost::asio::io_context io;return io;
}
這里getIoContext相當于一個單例模式,用于產生一個io對象
然后實例化app對象
?3.App類
//http\app.hpp
namespace crow
{
class App
{public:using raw_socket_t = boost::asio::ip::tcp::socket;using server_type = Server<App, raw_socket_t>;...std::optional<server_type> server;};
} // namespace crow
using App = crow::App;
?App這個類里面有一optional<server_type>類型的對象server
在實例化app對象時,目前還沒有真正的實例化serrver對象
?4.Server類
//http\http_server.hppnamespace crow
{struct Acceptor
{boost::asio::ip::tcp::acceptor acceptor;HttpType httpType;
};template <typename Handler, typename Adaptor = boost::asio::ip::tcp::socket>
class Server
{using self_t = Server<Handler, Adaptor>;public:Server(Handler* handlerIn, std::vector<Acceptor>&& acceptorsIn) :acceptors(std::move(acceptorsIn)),// NOLINTNEXTLINE(misc-include-cleaner)signals(getIoContext(), SIGINT, SIGTERM, SIGHUP), handler(handlerIn){}...private:boost::asio::signal_set signals;Handler* handler;};
} // namespace crow
Server類是個模版類,類的實例化傳入了App和boost::asio::ip::tcp::socket兩個模版參數
其中App類作為Handler的模版實參,用于定義一個反向指回App類的handler類指針
構造函數的std::vector<Acceptor>&& acceptorsIn參數后續再進行解釋
signals設置了進程響應的幾個信號