35#ifndef _ABSTRACT_TCP_SERVER2_H_
36#define _ABSTRACT_TCP_SERVER2_H_
41#include <boost/noncopyable.hpp>
42#include <boost/shared_ptr.hpp>
47#include <condition_variable>
49#include <boost/asio.hpp>
50#include <boost/asio/post.hpp>
51#include <boost/asio/ssl.hpp>
52#include <boost/asio/strand.hpp>
53#include <boost/asio/steady_timer.hpp>
54#include <boost/array.hpp>
55#include <boost/enable_shared_from_this.hpp>
56#include <boost/thread/thread.hpp>
57#include <boost/optional.hpp>
64#undef MONERO_DEFAULT_LOG_CATEGORY
65#define MONERO_DEFAULT_LOG_CATEGORY "net"
67#define ABSTRACT_SERVER_SEND_QUE_MAX_COUNT 1000
68#define ABSTRACT_SERVER_SEND_QUE_MAX_BYTES_DEFAULT 100 * 1024 * 1024
94 template<
class t_protocol_handler>
96 :
public boost::enable_shared_from_this<connection<t_protocol_handler> >,
97 private boost::noncopyable,
109 using ec_t = boost::system::error_code;
110 using handshake_t = boost::asio::ssl::stream_base::handshake_type;
148 bool is_multithreaded,
149 boost::optional<network_address> real_remote
277 t_protocol_handler::config_type(),
292 std::shared_ptr<shared_state>
state,
298 boost::asio::ip::tcp::socket&& sock,
299 std::shared_ptr<shared_state>
state,
309 bool start(
bool is_income,
bool is_multithreaded);
344 template<
class t_protocol_handler>
346 :
private boost::noncopyable
369 uint32_t port_ipv6 = 0,
const std::string& address_ipv6 =
"::",
bool use_ipv6 =
false,
bool require_ipv4 =
true,
372 const std::string port_ipv6 =
"",
const std::string address_ipv6 =
"::",
bool use_ipv6 =
false,
bool require_ipv4 =
true,
376 bool run_server(
size_t threads_count,
bool wait =
true,
const boost::thread::attributes& attrs = boost::thread::attributes());
406 template<
class t_callback>
433 auto connections_count =
m_state->sock_count > 0 ? (
m_state->sock_count - 1) : 0;
434 return connections_count;
451 template <
class t_handler>
467 template<
class t_handler>
470 boost::shared_ptr<idle_callback_conext<t_handler>> ptr(
new idle_callback_conext<t_handler>(
io_context_, t_callback, timeout_ms));
472 ptr->m_timer.expires_from_now(boost::posix_time::milliseconds(ptr->m_period));
477 template<
class t_handler>
481 if(!ptr->call_handler())
483 ptr->m_timer.expires_from_now(boost::posix_time::milliseconds(ptr->m_period));
488 template<
class t_handler>
491 boost::asio::post(
io_context_, std::forward<t_handler>(t_callback));
505 const std::shared_ptr<typename connection<t_protocol_handler>::shared_state>
m_state;
515 boost::asio::executor_work_guard<boost::asio::io_context::executor_type>
work;
534 std::vector<boost::shared_ptr<boost::thread> >
m_threads;
#define ABSTRACT_SERVER_SEND_QUE_MAX_BYTES_DEFAULT
Definition abstract_tcp_server2.h:68
the connection templated-class for one peer connection
static uint64_t h
Definition blockchain_stats.cpp:55
Definition byte_slice.h:69
boost::asio::ip::tcp::acceptor acceptor_ipv6
Definition abstract_tcp_server2.h:522
boost::shared_ptr< connection< t_protocol_handler > > connection_ptr
Definition abstract_tcp_server2.h:356
uint32_t m_port
Definition abstract_tcp_server2.h:526
bool async_call(t_handler &&t_callback)
Definition abstract_tcp_server2.h:489
size_t m_threads_count
Definition abstract_tcp_server2.h:533
void set_connection_limit(i_connection_limit *plimit)
Definition abstract_tcp_server2.inl:1441
void handle_accept_ipv6(const boost::system::error_code &e)
Definition abstract_tcp_server2.inl:1567
bool add_idle_handler(t_handler t_callback, uint64_t timeout_ms)
Definition abstract_tcp_server2.h:468
bool m_require_ipv4
Definition abstract_tcp_server2.h:531
std::map< std::string, t_connection_type > server_type_map
Definition abstract_tcp_server2.h:365
void set_default_remote(epee::net_utils::network_address remote)
Definition abstract_tcp_server2.h:398
std::vector< boost::shared_ptr< boost::thread > > m_threads
Definition abstract_tcp_server2.h:534
boost::asio::ip::tcp::acceptor acceptor_
Definition abstract_tcp_server2.h:521
try_connect_result_t
Definition abstract_tcp_server2.h:349
@ CONNECT_FAILURE
Definition abstract_tcp_server2.h:351
@ CONNECT_NO_SSL
Definition abstract_tcp_server2.h:352
@ CONNECT_SUCCESS
Definition abstract_tcp_server2.h:350
std::atomic< bool > m_stop_signal_sent
Definition abstract_tcp_server2.h:525
~boosted_tcp_server()
Definition abstract_tcp_server2.inl:1250
bool connect(const std::string &adr, const std::string &port, uint32_t conn_timeot, t_connection_context &cn, const std::string &bind_ip="0.0.0.0", epee::net_utils::ssl_support_t ssl_support=epee::net_utils::ssl_support_t::e_ssl_support_autodetect)
Definition abstract_tcp_server2.inl:1767
bool timed_wait_server_stop(uint64_t wait_mseconds)
wait for service workers stop
Definition abstract_tcp_server2.inl:1526
bool is_stop_signal_sent() const noexcept
Definition abstract_tcp_server2.h:384
size_t get_threads_count()
Definition abstract_tcp_server2.h:392
connection_ptr new_connection_
Definition abstract_tcp_server2.h:542
boost::asio::io_context & get_io_context()
Definition abstract_tcp_server2.h:437
t_protocol_handler::connection_context t_connection_context
Definition abstract_tcp_server2.h:357
boosted_tcp_server(t_connection_type connection_type)
Definition abstract_tcp_server2.inl:1213
try_connect_result_t try_connect(connection_ptr new_connection_l, const std::string &adr, const std::string &port, boost::asio::ip::tcp::socket &sock_, const boost::asio::ip::tcp::endpoint &remote_endpoint, const std::string &bind_ip, uint32_t conn_timeout, epee::net_utils::ssl_support_t ssl_support)
Definition abstract_tcp_server2.inl:1669
boost::mutex connections_mutex
Definition abstract_tcp_server2.h:546
void handle_accept_ipv4(const boost::system::error_code &e)
Handle completion of an asynchronous accept operation.
Definition abstract_tcp_server2.inl:1561
bool global_timer_handler(boost::shared_ptr< idle_callback_conext< t_handler > > ptr)
Definition abstract_tcp_server2.h:478
connection_ptr new_connection_ipv6
Definition abstract_tcp_server2.h:543
const std::atomic< bool > & get_stop_signal() const noexcept
Definition abstract_tcp_server2.h:386
bool worker_thread()
Run the server's io_context loop.
Definition abstract_tcp_server2.inl:1394
void create_server_type_map()
Definition abstract_tcp_server2.inl:1257
int get_binded_port_ipv6()
Definition abstract_tcp_server2.h:428
bool add_connection(t_connection_context &out, boost::asio::ip::tcp::socket &&sock, network_address real_remote, epee::net_utils::ssl_support_t ssl_support=epee::net_utils::ssl_support_t::e_ssl_support_autodetect)
Definition abstract_tcp_server2.inl:1649
std::string m_address_ipv6
Definition abstract_tcp_server2.h:529
t_protocol_handler::config_type & get_config_object()
Definition abstract_tcp_server2.h:415
void send_stop_signal()
Stop the server.
Definition abstract_tcp_server2.inl:1543
critical_section m_threads_lock
Definition abstract_tcp_server2.h:536
bool deinit_server()
Definition abstract_tcp_server2.h:390
void set_connection_filter(i_connection_filter *pfilter)
Definition abstract_tcp_server2.inl:1434
t_connection_type m_connection_type
Definition abstract_tcp_server2.h:539
std::string m_address
Definition abstract_tcp_server2.h:528
std::string m_thread_name_prefix
Definition abstract_tcp_server2.h:532
epee::net_utils::network_address default_remote
Definition abstract_tcp_server2.h:523
bool run_server(size_t threads_count, bool wait=true, const boost::thread::attributes &attrs=boost::thread::attributes())
Run the server's io_context loop.
Definition abstract_tcp_server2.inl:1455
void handle_accept(const boost::system::error_code &e, bool ipv6=false)
Definition abstract_tcp_server2.inl:1573
bool connect_async(const std::string &adr, const std::string &port, uint32_t conn_timeot, const t_callback &cb, const std::string &bind_ip="0.0.0.0", epee::net_utils::ssl_support_t ssl_support=epee::net_utils::ssl_support_t::e_ssl_support_autodetect, t_connection_context &&initial=t_connection_context{})
boost::asio::ssl::context & get_ssl_context() noexcept
Definition abstract_tcp_server2.h:409
void set_threads_prefix(const std::string &prefix_name)
Definition abstract_tcp_server2.inl:1424
std::shared_ptr< typename t_protocol_handler::config_type > get_config_shared()
Definition abstract_tcp_server2.h:421
bool init_server(uint32_t port, const std::string &address="0.0.0.0", uint32_t port_ipv6=0, const std::string &address_ipv6="::", bool use_ipv6=false, bool require_ipv4=true, ssl_options_t ssl_options=ssl_support_t::e_ssl_support_autodetect)
Definition abstract_tcp_server2.inl:1265
int get_binded_port()
Definition abstract_tcp_server2.h:427
long get_connections_count() const
Definition abstract_tcp_server2.h:430
boost::asio::io_context & io_context_
Definition abstract_tcp_server2.h:518
std::unique_ptr< worker > m_io_context_local_instance
Definition abstract_tcp_server2.h:517
uint32_t m_port_ipv6
Definition abstract_tcp_server2.h:527
boosted_tcp_server(boost::asio::io_context &external_io_context, t_connection_type connection_type)
Definition abstract_tcp_server2.inl:1232
void set_response_soft_limit(std::size_t limit)
Definition abstract_tcp_server2.inl:1448
bool init_server(const std::string port, const std::string &address="0.0.0.0", const std::string port_ipv6="", const std::string address_ipv6="::", bool use_ipv6=false, bool require_ipv4=true, ssl_options_t ssl_options=ssl_support_t::e_ssl_support_autodetect)
Definition abstract_tcp_server2.inl:1374
bool m_use_ipv6
Definition abstract_tcp_server2.h:530
boost::thread::id m_main_thread_id
Definition abstract_tcp_server2.h:535
std::set< connection_ptr > connections_
Definition abstract_tcp_server2.h:547
bool is_thread_worker()
Definition abstract_tcp_server2.inl:1510
const std::shared_ptr< typename connection< epee::levin::async_protocol_handler< p2p_connection_context > >::shared_state > m_state
Definition abstract_tcp_server2.h:505
std::atomic< uint32_t > m_thread_index
Definition abstract_tcp_server2.h:537
connection_basic_shared_state()
Definition connection_basic.hpp:70
connection_basic(boost::asio::io_context &context, boost::asio::ip::tcp::socket &&sock, std::shared_ptr< connection_basic_shared_state > state, ssl_support_t ssl_support)
Definition connection_basic.cpp:124
void setRpcStation()
Definition abstract_tcp_server2.inl:1206
virtual bool call_run_once_service_io()
Definition abstract_tcp_server2.inl:1141
boost::asio::ip::tcp::socket socket_t
Definition abstract_tcp_server2.h:114
io_context_t & m_io_context
Definition abstract_tcp_server2.h:262
void terminate()
Definition abstract_tcp_server2.inl:742
io_context_t::strand strand_t
Definition abstract_tcp_server2.h:113
virtual bool send_done()
Definition abstract_tcp_server2.inl:1125
void start_timer(duration_t duration, bool add={})
Definition abstract_tcp_server2.inl:144
t_protocol_handler::connection_context t_connection_context
Definition abstract_tcp_server2.h:102
void cancel_handler()
Definition abstract_tcp_server2.inl:667
boost::asio::io_context io_context_t
Definition abstract_tcp_server2.h:112
void async_wait_timer()
Definition abstract_tcp_server2.inl:168
bool m_local
Definition abstract_tcp_server2.h:268
void start_write()
Definition abstract_tcp_server2.inl:469
test_levin_protocol_handler m_handler
Definition abstract_tcp_server2.h:271
void start_read()
Definition abstract_tcp_server2.inl:305
void interrupt()
Definition abstract_tcp_server2.inl:684
connection(io_context_t &io_context, std::shared_ptr< shared_state > state, t_connection_type connection_type, epee::net_utils::ssl_support_t ssl_support, t_connection_context &&initial=t_connection_context{})
Construct a connection with the given io_context.
Definition abstract_tcp_server2.inl:1012
void on_terminating()
Definition abstract_tcp_server2.inl:757
epee::net_utils::network_throttle_manager network_throttle_manager_t
Definition abstract_tcp_server2.h:117
connection< t_protocol_handler > connection_t
Definition abstract_tcp_server2.h:104
virtual bool do_send(byte_slice message)
(see do_send from i_service_endpoint)
Definition abstract_tcp_server2.inl:1119
bool send(epee::byte_slice message)
Definition abstract_tcp_server2.inl:811
virtual bool release()
Definition abstract_tcp_server2.inl:1196
void finish_read(size_t bytes_transferred)
Definition abstract_tcp_server2.inl:413
virtual bool request_callback()
Definition abstract_tcp_server2.inl:1155
bool speed_limit_is_enabled() const
tells us should we be sleeping here (e.g. do not sleep on RPC connections)
Definition abstract_tcp_server2.inl:1107
boost::shared_ptr< connection_t > connection_ptr
Definition abstract_tcp_server2.h:105
void on_interrupted()
Definition abstract_tcp_server2.inl:697
std::string m_host
Definition abstract_tcp_server2.h:269
void start_handshake()
Definition abstract_tcp_server2.inl:209
virtual io_context_t & get_io_context()
Definition abstract_tcp_server2.inl:1175
timers_t m_timers
Definition abstract_tcp_server2.h:266
epee::net_utils::network_throttle network_throttle_t
Definition abstract_tcp_server2.h:116
boost::asio::steady_timer timer_t
Definition abstract_tcp_server2.h:107
bool start_internal(bool is_income, bool is_multithreaded, boost::optional< network_address > real_remote)
Definition abstract_tcp_server2.inl:909
void get_context(t_connection_context &context_)
Definition abstract_tcp_server2.h:314
status_t
Definition abstract_tcp_server2.h:152
@ RUNNING
Definition abstract_tcp_server2.h:154
@ INTERRUPTED
Definition abstract_tcp_server2.h:155
@ TERMINATING
Definition abstract_tcp_server2.h:156
@ WASTED
Definition abstract_tcp_server2.h:157
@ TERMINATED
Definition abstract_tcp_server2.h:153
void terminate_async()
Definition abstract_tcp_server2.inl:800
boost::asio::ssl::stream_base::handshake_type handshake_t
Definition abstract_tcp_server2.h:110
duration_t get_timeout_from_bytes_read(size_t bytes) const
Definition abstract_tcp_server2.inl:115
virtual ~connection() noexcept(false)
Definition abstract_tcp_server2.inl:1050
connection(io_context_t &io_context, boost::asio::ip::tcp::socket &&sock, std::shared_ptr< shared_state > state, t_connection_type connection_type, epee::net_utils::ssl_support_t ssl_support, t_connection_context &&initial=t_connection_context{})
Definition abstract_tcp_server2.inl:1031
void cancel_timer()
Definition abstract_tcp_server2.inl:199
void state_status_check()
Definition abstract_tcp_server2.inl:125
state_t m_state
Definition abstract_tcp_server2.h:270
strand_t m_strand
Definition abstract_tcp_server2.h:265
void start_shutdown()
Definition abstract_tcp_server2.inl:599
epee::net_utils::ssl_support_t ssl_support_t
Definition abstract_tcp_server2.h:106
void cancel_socket()
Definition abstract_tcp_server2.inl:641
t_connection_context m_conn_context
Definition abstract_tcp_server2.h:264
void save_dbg_log()
Definition abstract_tcp_server2.inl:1082
virtual bool add_ref()
Definition abstract_tcp_server2.inl:1181
unsigned int host_count(int delta=0)
Definition abstract_tcp_server2.inl:81
bool start(bool is_income, bool is_multithreaded)
timer_t::duration duration_t
Definition abstract_tcp_server2.h:108
bool cancel()
Definition abstract_tcp_server2.inl:1113
t_connection_type m_connection_type
Definition abstract_tcp_server2.h:263
connection_ptr self
Definition abstract_tcp_server2.h:267
virtual bool close()
Definition abstract_tcp_server2.inl:1131
duration_t get_default_timeout()
Definition abstract_tcp_server2.inl:98
boost::system::error_code ec_t
Definition abstract_tcp_server2.h:109
Definition net_utils_base.h:225
Definition network_throttle.hpp:98
Definition network_throttle-detail.hpp:48
base for connection, contains e.g. the ratelimit hooks
#define const
Definition ipfrdr.c:80
uint32_t address
Definition getifaddr.c:269
@ ipv6
Definition enums.h:44
t_connection_type
Definition connection_basic.hpp:93
ssl_support_t
Definition net_ssl.h:49
@ e_ssl_support_autodetect
Definition net_ssl.h:52
TODO: (mj-xmr) This will be reduced in an another PR.
Definition byte_slice.h:40
implementaion for throttling of connection (count and rate-limit speed etc)
unsigned int uint32_t
Definition stdint.h:126
unsigned __int64 uint64_t
Definition stdint.h:136
idle_callback_conext_base(boost::asio::io_context &io_serice)
Definition abstract_tcp_server2.h:445
virtual ~idle_callback_conext_base()
Definition abstract_tcp_server2.h:441
boost::asio::deadline_timer m_timer
Definition abstract_tcp_server2.h:448
virtual bool call_handler()
Definition abstract_tcp_server2.h:443
t_handler m_handler
Definition abstract_tcp_server2.h:459
idle_callback_conext(boost::asio::io_context &io_serice, t_handler &h, uint64_t period)
Definition abstract_tcp_server2.h:454
uint64_t m_period
Definition abstract_tcp_server2.h:464
virtual bool call_handler()
Definition abstract_tcp_server2.h:460
worker()
Definition abstract_tcp_server2.h:510
boost::asio::io_context io_context
Definition abstract_tcp_server2.h:514
boost::asio::executor_work_guard< boost::asio::io_context::executor_type > work
Definition abstract_tcp_server2.h:515
i_connection_filter * pfilter
Definition abstract_tcp_server2.h:284
bool stop_signal_sent
Definition abstract_tcp_server2.h:287
i_connection_limit * plimit
Definition abstract_tcp_server2.h:285
shared_state()
Definition abstract_tcp_server2.h:275
std::size_t response_soft_limit
Definition abstract_tcp_server2.h:286
Definition abstract_tcp_server2.h:170
std::size_t total_bytes
Definition abstract_tcp_server2.h:176
bool wait_consume
Definition abstract_tcp_server2.h:177
std::array< uint8_t, 0x2000 > buffer
Definition abstract_tcp_server2.h:172
std::deque< epee::byte_slice > queue
Definition abstract_tcp_server2.h:175
Definition abstract_tcp_server2.h:223
size_t wait_callback
Definition abstract_tcp_server2.h:230
bool released
Definition abstract_tcp_server2.h:225
bool wait_release
Definition abstract_tcp_server2.h:228
bool initialized
Definition abstract_tcp_server2.h:226
size_t reference_counter
Definition abstract_tcp_server2.h:224
bool wait_init
Definition abstract_tcp_server2.h:229
Definition abstract_tcp_server2.h:188
bool cancel_read
Definition abstract_tcp_server2.h:196
bool handle_read
Definition abstract_tcp_server2.h:195
bool cancel_handshake
Definition abstract_tcp_server2.h:192
bool shutdown_read
Definition abstract_tcp_server2.h:197
bool cancel_write
Definition abstract_tcp_server2.h:201
bool connected
Definition abstract_tcp_server2.h:189
bool wait_read
Definition abstract_tcp_server2.h:194
bool wait_write
Definition abstract_tcp_server2.h:199
bool wait_handshake
Definition abstract_tcp_server2.h:191
bool wait_shutdown
Definition abstract_tcp_server2.h:203
bool cancel_shutdown
Definition abstract_tcp_server2.h:204
bool handle_write
Definition abstract_tcp_server2.h:200
Definition abstract_tcp_server2.h:181
bool forced
Definition abstract_tcp_server2.h:183
bool enabled
Definition abstract_tcp_server2.h:182
bool detected
Definition abstract_tcp_server2.h:184
bool handshaked
Definition abstract_tcp_server2.h:185
Definition abstract_tcp_server2.h:161
network_throttle_t throttle
Definition abstract_tcp_server2.h:163
Definition abstract_tcp_server2.h:207
bool reset_expire
Definition abstract_tcp_server2.h:210
bool cancel_expire
Definition abstract_tcp_server2.h:209
bool wait_expire
Definition abstract_tcp_server2.h:208
Definition abstract_tcp_server2.h:214
timer_status_t in
Definition abstract_tcp_server2.h:215
timer_status_t out
Definition abstract_tcp_server2.h:216
Definition abstract_tcp_server2.h:213
throttle_t throttle
Definition abstract_tcp_server2.h:220
timer_status_t general
Definition abstract_tcp_server2.h:219
Definition abstract_tcp_server2.h:160
socket_status_t socket
Definition abstract_tcp_server2.h:236
std::condition_variable_any condition
Definition abstract_tcp_server2.h:234
std::mutex lock
Definition abstract_tcp_server2.h:233
data_t data
Definition abstract_tcp_server2.h:241
status_t status
Definition abstract_tcp_server2.h:235
timers_status_t timers
Definition abstract_tcp_server2.h:238
protocol_t protocol
Definition abstract_tcp_server2.h:239
ssl_t ssl
Definition abstract_tcp_server2.h:237
stat_t stat
Definition abstract_tcp_server2.h:240
Definition abstract_tcp_server2.h:249
throttle_t(io_context_t &io_context)
Definition abstract_tcp_server2.h:250
timer_t in
Definition abstract_tcp_server2.h:254
timer_t out
Definition abstract_tcp_server2.h:255
timer_t general
Definition abstract_tcp_server2.h:258
timers_t(io_context_t &io_context)
Definition abstract_tcp_server2.h:245
throttle_t throttle
Definition abstract_tcp_server2.h:259
Definition abstract_tcp_server2.h:76
virtual ~i_connection_filter()
Definition abstract_tcp_server2.h:79
virtual bool is_remote_host_allowed(const epee::net_utils::network_address &address, time_t *t=NULL)=0
Definition abstract_tcp_server2.h:83
virtual ~i_connection_limit()
Definition abstract_tcp_server2.h:86
virtual bool is_host_limit(const epee::net_utils::network_address &address)=0
Definition net_utils_base.h:442