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设置了进程响应的几个信号