1.监听用户移除signal
cpp
//src\webserver_run.cpp
int run()
{
...
bmcweb::registerUserRemovedSignal();
...
}
cpp
//include\user_monitor.hpp
inline void onUserRemoved(sdbusplus::message_t& msg)
{
sdbusplus::message::object_path p;
msg.read(p);
std::string username = p.filename();
persistent_data::SessionStore::getInstance().removeSessionsByUsername(
username);
}
inline void registerUserRemovedSignal()
{
std::string userRemovedMatchStr =
sdbusplus::bus::match::rules::interfacesRemoved(
"/xyz/openbmc_project/user");
static sdbusplus::bus::match_t userRemovedMatch(
*crow::connections::systemBus, userRemovedMatchStr, onUserRemoved);
}
关于注册signal,可以参考
sdbusplus:监听属性的变化_sdbusplus::bus::match::match-CSDN博客
这部分的作用是当发现某个用户被移除后,删除该用户的session
session部分后续再介绍
2.app.run获取socket
cpp
//src\webserver_run.cpp
int run()
{
...
app.run();
systemBus->request_name("xyz.openbmc_project.bmcweb");
io.run();
crow::connections::systemBus = nullptr;
return 0;
}
其中app.run的定义如下:
cpp
//http\app.hpp
void run()
{
validate();
std::vector<Acceptor> acceptors = setupSocket();
server.emplace(this, std::move(acceptors));
server->run();
}
validate();是用于检验route,这个后续跟路由一起解释
cpp
//http\http_server.hpp
struct Acceptor
{
boost::asio::ip::tcp::acceptor acceptor;
HttpType httpType;
};
cpp
//http\http_connect_types.hpp
enum class HttpType
{
HTTPS, // Socket supports HTTPS only
HTTP, // Socket supports HTTP only
BOTH // Socket supports both HTTPS and HTTP, with HTTP Redirect
};
static std::vector<Acceptor> setupSocket() 的作用是获取socket,这个后续再详细解释
3.app.run构造server对象
cpp
//http\http_server.hpp
template <typename Handler, typename Adaptor = boost::asio::ip::tcp::socket>
class Server
{
public:
Server(Handler* handlerIn, std::vector<Acceptor>&& acceptorsIn) :
acceptors(std::move(acceptorsIn)),
// NOLINTNEXTLINE(misc-include-cleaner)
signals(getIoContext(), SIGINT, SIGTERM, SIGHUP), handler(handlerIn)
{}
...
private:
std::vector<Acceptor> acceptors;
Handler* handler;
}
介绍了server类,但是当时没有构造server类的实例,
构造server类的实例是在app.run中
server.emplace(this, std::move(acceptors));完成的
将App做为handle传入Server,用于反向指回app对象
将setupSocket()获取的socket也传入了Server,用于后续接受连接请求。