7 #ifndef swcdb_core_comm_SerializedClient_h
8 #define swcdb_core_comm_SerializedClient_h
17 namespace SWC {
namespace Comm {
25 class Serialized final :
public std::enable_shared_from_this<Serialized> {
28 typedef std::shared_ptr<Serialized>
Ptr;
31 std::string&& srv_name,
49 const std::chrono::milliseconds& timeout,
54 template<
typename HdlrT>
59 const std::chrono::milliseconds& timeout,
60 uint16_t probes) noexcept {
61 get_connection<HdlrT>(endpoints, timeout, probes, std::move(cb));
64 template<
typename HdlrT,
typename... DataArgsT>
68 const std::chrono::milliseconds& timeout,
70 DataArgsT&&... args) noexcept {
73 if(endpoints.empty()) {
82 std::forward<DataArgsT>(args)...
88 HdlrT(std::forward<DataArgsT>(args)...)(
nullptr);
98 template<
typename HdlrT>
100 using SocketPtr = std::shared_ptr<asio::ip::tcp::socket>;
111 template<
typename... DataArgsT>
114 const EndPoints& a_endpoints, uint16_t a_probes,
116 :
ptr(std::move(a_ptr)),
122 :
ptr(std::move(other.ptr)),
125 socket(std::move(other.socket)),
126 callback(std::move(other.callback)) {
138 <<
ptr->m_srv_name <<
' ' << endpoint <<
' '
139 << (
ptr->m_ssl_cfg &&
ptr->m_ssl_cfg->need_ssl(endpoint)
140 ?
"SECURE" :
"PLAIN"); );
142 socket.reset(
new asio::ip::tcp::socket(
ptr->m_ioctx->executor()));
144 sock->async_connect(endpoint, std::move(*
this));
153 }
else if(
socket->is_open())
try {
157 socket->remote_endpoint().address()
158 !=
socket->local_endpoint().address()) {
165 : conn(a_conn), connector(std::move(hdlr)) {
167 Handshaker(Handshaker&& other) noexcept
168 : conn(std::move(other.conn)),
169 connector(std::move(other.connector)) {
171 Handshaker(
const Handshaker&) =
delete;
172 Handshaker&
operator=(Handshaker&&) =
delete;
173 Handshaker&
operator=(
const Handshaker&) =
delete;
174 ~Handshaker() noexcept { }
176 if(conn->is_open()) {
178 conn->new_connection();
180 connector.
ptr->m_calls.fetch_sub(1);
188 auto conn =
ptr->m_ssl_cfg->make_client(
ptr->m_ctx, *
socket.get());
190 SocketSSL::client, Handshaker(conn, std::move(*
this)));
195 if(conn->is_open()) {
196 conn->new_connection();
198 ptr->m_calls.fetch_sub(1);
213 std::this_thread::sleep_for(std::chrono::milliseconds(3000));
223 ptr->m_calls.fetch_sub(1);
241 #ifdef SWC_IMPL_SOURCE
245 #endif // swcdb_core_comm_SerializedClient_h