AdcNetServiceASIOBase: add acceptor_t inner class
This commit is contained in:
@@ -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;
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user