|
SWC-DB
v0.5.12 C++ documentations
SWC-DB© (Super Wide Column Database) - High Performance Scalable Database (https://github.com/kashirin-alex/swc-db)
|
Go to the documentation of this file.
11 namespace SWC {
namespace Comm {
namespace server {
29 conn->new_connection();
32 ec.value(), ec.message().c_str());
40 void operator()(std::error_code ec, asio::ip::tcp::socket new_sock) {
41 bool need_ssl =
false;
43 if(ec.value() == ECANCELED)
46 ec.value(), ec.message().c_str());
48 }
else if(new_sock.is_open()) {
51 new_sock.local_endpoint(ec), new_sock.remote_endpoint(ec));
56 conn->handshake(SocketSSL::server,
Handshaker(conn));
60 conn->new_connection();
62 }
else if(new_sock.is_open()) {
80 void operator()(
const std::error_code& ec, asio::ip::tcp::socket new_sock) {
82 if(ec.value() == ECANCELED)
85 ec.value(), ec.message().c_str());
87 }
else if(new_sock.is_open()) {
90 conn->new_connection();
103 SWC_SHOULD_NOT_INLINE
107 : asio::ip::tcp::acceptor(std::move(acceptor)),
110 set_option(asio::ip::tcp::acceptor::reuse_address(
true));
111 set_option(asio::ip::tcp::no_delay(
true));
116 async_accept(
Mixed(
this));
118 async_accept(
Plain(
this));
122 <<
" fd=" << native_handle()
123 <<
' ' << (
m_ssl_cfg ?
"SECURE" :
"PLAIN");
130 <<
" fd=" << native_handle();
140 SWC_SHOULD_NOT_INLINE
144 bool concurrency_relative,
145 uint32_t reactors, uint32_t workers,
148 ) : m_appname(std::move(name)), m_run(true),
149 m_io_contexts(), m_acceptors(), m_mutex(), m_conns(),
151 settings.get_bool(
"swc.comm.ssl")
157 if(concurrency_relative) {
158 uint32_t num_cores = std::thread::hardware_concurrency();
159 reactors = num_cores / reactors;
160 if(reactors < 1) reactors = 1;
167 if(settings.
has(
"addr"))
171 if(settings.
has(
"host"))
172 host = host.append(settings.
get_str(
"host"));
175 if(gethostname(hostname,
sizeof(hostname)) == -1)
177 host.append(hostname);
183 settings.
get_strs(
"swc.comm.network.priority"), nets, ec);
186 "swc.comm.network.priority error(%s)",
187 ec.message().c_str());
198 for(uint32_t reactor=0; reactor<reactors; ++reactor) {
204 for (std::size_t i = 0; i < endpoints.
size(); ++i) {
209 <<
' ' << (ssl_conn ?
"SECURE" :
"PLAIN");
213 auto acceptor = asio::ip::tcp::acceptor(
218 acceptor, app_ctx, ssl_conn ?
m_ssl_cfg :
nullptr));
222 auto acceptor = asio::ip::tcp::acceptor(
224 endpoints[i].protocol(),
228 acceptor, app_ctx, ssl_conn ?
m_ssl_cfg :
nullptr));
234 app_ctx->init(host, endpoints_final);
238 app_ctx->init(host, sorted);
244 SWC_SHOULD_NOT_INLINE
255 std::shared_ptr<IoContext::ExecutorWorkGuard>
257 auto guard = std::shared_ptr<IoContext::ExecutorWorkGuard>(
299 if(conn->endpoint_remote == (*it)->endpoint_remote){
SWC_CAN_INLINE iterator erase(size_type offset) noexcept(_NoExceptMoveAssign &&_NoExceptDestructor)
void close(const ConnHandlerPtr &conn, const Event::Ptr &ev)
Strings get_strs(const char *name) const
void get_networks(const Config::Strings &networks, Networks &nets, asio::error_code &ec)
#define SWC_LOGF(priority, fmt,...)
#define SWC_LOG_OUT(pr, _code_)
std::shared_ptr< ConnHandlerSSL > Ptr
#define SWC_THROW(_code_, _msg_)
void operator()(const std::error_code &ec, asio::ip::tcp::socket new_sock)
Acceptor(asio::ip::tcp::acceptor &acceptor, AppContext::Ptr &app_ctx, ConfigSSL *ssl_cfg)
void operator()(std::error_code ec, asio::ip::tcp::socket new_sock)
void connection_add(const ConnHandlerPtr &conn)
SWC_CAN_INLINE Mixed(Acceptor *a_acceptor) noexcept
SerializedServer(const Config::Settings &settings, std::string &&name, bool concurrency_relative, uint32_t reactors, uint32_t workers, uint16_t port, AppContext::Ptr app_ctx)
std::shared_ptr< AppContext > Ptr
Core::Vector< ConnHandlerPtr > m_conns
constexpr SWC_CAN_INLINE void store(T v) noexcept
constexpr SWC_CAN_INLINE bool empty() const noexcept
constexpr SWC_CAN_INLINE reference back() noexcept
SWC_CAN_INLINE Handshaker(Handshaker &&other) noexcept
The SWC-DB C++ namespace 'SWC'.
bool SWC_PURE_FUNC has(const char *name) const noexcept
Core::Vector< IoContextPtr > m_io_contexts
SWC_CAN_INLINE Plain(Acceptor *a_acceptor) noexcept
#define SWC_THROWF(_code_, _fmt_,...)
Handshaker(const Handshaker &)=delete
void sort(const Networks &nets, const EndPoints &endpoints, EndPoints &sorted)
void operator()(const asio::error_code &ec)
AppContext::Ptr m_app_ctx
std::shared_ptr< ConnHandler > ConnHandlerPtr
Handshaker & operator=(Handshaker &&)=delete
std::string get_str(const char *name) const
constexpr SWC_CAN_INLINE const_iterator cend() const noexcept
#define SWC_EXPECT(_e_, _code_)
SWC_CAN_INLINE Handshaker(const ConnHandlerSSL::Ptr &a_conn)
void connection_del(const ConnHandlerPtr &conn)
~SerializedServer() noexcept
SWC_CAN_INLINE bool need_ssl(const EndPoint &remote) const noexcept
asio::executor_work_guard< Executor > ExecutorWorkGuard
std::shared_ptr< IoContext::ExecutorWorkGuard > stop_accepting()
EndPoints get_endpoints(uint16_t defaul_port, const Config::Strings &addrs, const std::string &host, const Networks &nets, bool srv=false)
SWC_CAN_INLINE void push_back(ArgsT &&... args)
constexpr SWC_CAN_INLINE const_iterator cbegin() const noexcept
SWC_CAN_INLINE std::string to_string(const BitFieldInt< T, SZ > &v)
static IoContextPtr make(std::string &&_name, int32_t size)
constexpr SWC_CAN_INLINE size_type size() const noexcept
static Ptr make(AppContext::Ptr &app_ctx, SocketPlain &socket)
#define SWC_LOG_CURRENT_EXCEPTION(_s_)
SWC_CAN_INLINE reference emplace_back(ArgsT &&... args)
Core::Vector< Acceptor::Ptr > m_acceptors
Handshaker & operator=(const Handshaker &)=delete
ConnHandlerSSL::Ptr make_connection(AppContext::Ptr &app_ctx, SocketPlain &socket) const
const std::string m_appname