AdcNetServiceASIOBase: add acceptor_t inner class

This commit is contained in:
Timur A. Fatkhullin
2024-10-01 23:33:53 +03:00
parent d2b2620d13
commit f329bcecec
4 changed files with 173 additions and 181 deletions

View File

@@ -182,24 +182,26 @@ public:
return _serverIdent;
}
template <interfaces::adc_netsession_c SessionT, typename... NetsrvCtorArgTs>
void start(const typename SessionT::netservice_t::endpoint_t& endpoint,
const typename SessionT::netsession_ident_t& id,
typename SessionT::netsession_ctx_t&& sess_ctx,
NetsrvCtorArgTs&&... ctor_args)
// start accepting remote connections, create and start given network session
// It must be assumed that this is asynchronous operation!!!
template <interfaces::adc_netsession_c SessionT, typename... AccCtorArgTs>
void start(const typename SessionT::netsession_ident_t& id,
const typename SessionT::netsession_ctx_t& sess_ctx,
AccCtorArgTs&&... ctor_args)
{
typename SessionT::netservice_t netservice(std::forward<NetsrvCtorArgTs>(ctor_args)...);
auto acceptor =
std::make_shared<typename SessionT::netservice_t::acceptor_t>(std::forward<AccCtorArgTs>(ctor_args)...);
netservice.asyncAccept(endpoint, [&endpoint, &id, sess_ctx, this](auto ec, auto...) {
if (!ec) {
auto sess = std::make_shared<SessionT>(id, std::forward<typename SessionT::netsession_ctx_t>(sess_ctx));
startSession(sess);
start(endpoint, id, sess_ctx);
}
});
doAccept<SessionT>(acceptor, id, sess_ctx);
};
template <interfaces::adc_netsession_c SessionT>
bool isListening() const
{
return _isListening<SessionT>[this];
}
virtual void start() = 0;
virtual void stop()
@@ -210,7 +212,26 @@ public:
protected:
template <interfaces::adc_netsession_c SessionT>
inline static std::unordered_map<const AdcGenericNetServer*, bool> _isListening{};
server_ident_t _serverIdent;
template <typename SessionT, typename AT, typename IDT, typename CTXT>
void doAccept(std::shared_ptr<AT> acceptor, const IDT& id, CTXT& sess_ctx)
{
acceptor.asyncAccept([acceptor, &id, &sess_ctx, this](auto ec, typename SessionT::netservice_t srv) mutable {
if (!ec) {
auto sess = std::make_shared<SessionT>(id, std::move(srv), sess_ctx);
startSession(sess);
_isListening<SessionT>[this] = true;
doAccept(acceptor, id, sess_ctx);
} else {
_isListening<SessionT>[this] = false;
}
});
}
};