fix 100% load of CPU after client disconnection
(AdcBaseNetServiceASIO.asyncReceive) add resolving domain name (AdcDeviceNetServerASIO)
This commit is contained in:
@@ -8,7 +8,7 @@ namespace adc
|
||||
{
|
||||
|
||||
|
||||
/* */
|
||||
/* A VERY GENERIC NETWORK CLIENT */
|
||||
|
||||
|
||||
template <typename IdentT = std::string, interfaces::adc_logger_c LoggerT = utils::AdcOstreamLogger<char>>
|
||||
@@ -30,11 +30,13 @@ public:
|
||||
stopAllSessions();
|
||||
}
|
||||
|
||||
|
||||
// start the client: connect to server and start session
|
||||
template <interfaces::adc_netsession_c SessionT, typename... NetServiceCtorArgTs>
|
||||
void asyncConnect(const SessionT::netservice_t::endpoint_t& endpoint,
|
||||
SessionT::netsession_ident_t id,
|
||||
SessionT::netsession_ctx_t sess_ctx,
|
||||
NetServiceCtorArgTs&&... ctor_args)
|
||||
void start(const SessionT::netservice_t::endpoint_t& endpoint,
|
||||
SessionT::netsession_ident_t id,
|
||||
SessionT::netsession_ctx_t sess_ctx,
|
||||
NetServiceCtorArgTs&&... ctor_args)
|
||||
{
|
||||
auto srv_sptr =
|
||||
std::make_shared<typename SessionT::netservice_t>(std::forward<NetServiceCtorArgTs>(ctor_args)...);
|
||||
@@ -53,20 +55,6 @@ public:
|
||||
}
|
||||
|
||||
|
||||
template <interfaces::adc_netsession_c SessionT, typename... NetServiceCtorArgTs>
|
||||
void connect(const SessionT::netservice_t::endpoint_t& endpoint,
|
||||
SessionT::netsession_ident_t id,
|
||||
SessionT::netsession_ctx_t sess_ctx,
|
||||
NetServiceCtorArgTs&&... ctor_args)
|
||||
{
|
||||
typename SessionT::netservice_t srv(std::forward<NetServiceCtorArgTs>(ctor_args)...);
|
||||
srv.connect(endpoint, _connectTimeout);
|
||||
|
||||
auto sess = std::make_shared<SessionT>(std::move(id), std::move(srv), std::move(sess_ctx));
|
||||
startSession(sess);
|
||||
}
|
||||
|
||||
|
||||
template <traits::adc_time_duration_c DT>
|
||||
void setConnectTimeout(const DT& timeout)
|
||||
{
|
||||
@@ -82,6 +70,29 @@ protected:
|
||||
client_ident_t _clientIdent;
|
||||
|
||||
std::chrono::milliseconds _connectTimeout = std::chrono::milliseconds(5000);
|
||||
|
||||
template <interfaces::adc_netservice_c ServiceT,
|
||||
traits::adc_input_char_range SendMsgT,
|
||||
typename TokenT,
|
||||
traits::adc_time_duration_c SendTimeoutT = std::chrono::milliseconds,
|
||||
traits::adc_time_duration_c RecvTimeoutT = std::chrono::milliseconds>
|
||||
auto asyncSendRecv(ServiceT& netservice,
|
||||
const SendMsgT& send_msg,
|
||||
TokenT&& token,
|
||||
const SendTimeoutT& send_timeout = std::chrono::milliseconds(5000),
|
||||
const RecvTimeoutT& recv_timeout = std::chrono::milliseconds(5000))
|
||||
{
|
||||
return netservice.asyncSend(
|
||||
send_msg,
|
||||
[&netservice, recv_timeout, wrapper = traits::adc_pf_wrapper(std::forward<TokenT>(token)), this](auto err) {
|
||||
if (err) {
|
||||
this->logError("An error occured while sending the message: {}", ServiceT::formattableError(err));
|
||||
} else {
|
||||
netservice.asyncReceive(std::get<0>(wrapper), recv_timeout);
|
||||
}
|
||||
},
|
||||
send_timeout);
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace adc
|
||||
|
||||
Reference in New Issue
Block a user