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;
146 bool is_multithreaded,
147 boost::optional<network_address> real_remote
274 t_protocol_handler::config_type(),
289 std::shared_ptr<shared_state>
state,
296 std::shared_ptr<shared_state>
state,
306 bool start(
bool is_income,
bool is_multithreaded);
309 bool start(
bool is_income,
bool is_multithreaded, network_address real_remote);
326 virtual bool close();
341 template<
class t_protocol_handler>
343 :
private boost::noncopyable
366 uint32_t port_ipv6 = 0,
const std::string& address_ipv6 =
"::",
bool use_ipv6 =
false,
bool require_ipv4 =
true,
369 const std::string port_ipv6 =
"",
const std::string address_ipv6 =
"::",
bool use_ipv6 =
false,
bool require_ipv4 =
true,
373 bool run_server(
size_t threads_count,
bool wait =
true,
const boost::thread::attributes& attrs = boost::thread::attributes());
403 template<
class t_callback>
430 auto connections_count =
m_state->sock_count > 0 ? (
m_state->sock_count - 1) : 0;
431 return connections_count;
448 template <
class t_handler>
464 template<
class t_handler>
467 boost::shared_ptr<idle_callback_conext<t_handler>> ptr(
new idle_callback_conext<t_handler>(
io_context_, t_callback, timeout_ms));
469 ptr->m_timer.expires_from_now(boost::posix_time::milliseconds(ptr->m_period));
474 template<
class t_handler>
478 if(!ptr->call_handler())
480 ptr->m_timer.expires_from_now(boost::posix_time::milliseconds(ptr->m_period));
485 template<
class t_handler>
488 boost::asio::post(
io_context_, std::forward<t_handler>(t_callback));
502 const std::shared_ptr<typename connection<t_protocol_handler>::shared_state>
m_state;
512 boost::asio::executor_work_guard<boost::asio::io_context::executor_type>
work;
531 std::vector<boost::shared_ptr<boost::thread> >
m_threads;
boost::asio::executor_work_guard< boost::asio::io_context::executor_type > work
Definition: abstract_tcp_server2.h:512
void handle_accept_ipv6(const boost::system::error_code &e)
Definition: abstract_tcp_server2.inl:1527
t_connection_context m_conn_context
Definition: abstract_tcp_server2.h:261
virtual bool request_callback()
Definition: abstract_tcp_server2.inl:1115
virtual ~i_connection_limit()
Definition: abstract_tcp_server2.h:86
state_t m_state
Definition: abstract_tcp_server2.h:267
void on_terminating()
Definition: abstract_tcp_server2.inl:723
virtual bool call_handler()
Definition: abstract_tcp_server2.h:440
size_t get_threads_count()
Definition: abstract_tcp_server2.h:389
void terminate()
Definition: abstract_tcp_server2.inl:708
bool m_use_ipv6
Definition: abstract_tcp_server2.h:527
virtual ~i_connection_filter()
Definition: abstract_tcp_server2.h:79
bool cancel_expire
Definition: abstract_tcp_server2.h:206
t_protocol_handler::connection_context t_connection_context
Definition: abstract_tcp_server2.h:354
timer_t in
Definition: abstract_tcp_server2.h:251
void set_connection_limit(i_connection_limit *plimit)
Definition: abstract_tcp_server2.inl:1401
virtual bool call_run_once_service_io()
Definition: abstract_tcp_server2.inl:1101
Definition: abstract_tcp_server2.h:342
virtual bool close()
Definition: abstract_tcp_server2.inl:1091
t_handler m_handler
Definition: abstract_tcp_server2.h:456
shared_state()
Definition: abstract_tcp_server2.h:272
virtual bool is_host_limit(const epee::net_utils::network_address &address)=0
Definition: abstract_tcp_server2.h:241
boosted_tcp_server(t_connection_type connection_type)
Definition: abstract_tcp_server2.inl:1173
std::string m_address_ipv6
Definition: abstract_tcp_server2.h:526
bool wait_handshake
Definition: abstract_tcp_server2.h:189
critical_section m_threads_lock
Definition: abstract_tcp_server2.h:533
t_protocol_handler m_handler
Definition: abstract_tcp_server2.h:268
enum upnpconfigoptions id
Definition: options.c:29
bool cancel_write
Definition: abstract_tcp_server2.h:198
Definition: abstract_tcp_server2.h:348
::std::string string
Definition: gtest-port.h:1097
Definition: net_utils_base.h:224
bool wait_release
Definition: abstract_tcp_server2.h:225
the connection templated-class for one peer connection
t
Definition: console.py:33
bool connected
Definition: abstract_tcp_server2.h:187
std::atomic< uint32_t > m_thread_index
Definition: abstract_tcp_server2.h:534
std::array< uint8_t, 0x2000 > buffer
Definition: abstract_tcp_server2.h:170
timer_status_t in
Definition: abstract_tcp_server2.h:212
Definition: abstract_tcp_server2.h:186
std::string m_host
Definition: abstract_tcp_server2.h:266
t_connection_type m_connection_type
Definition: abstract_tcp_server2.h:260
boost::asio::ip::tcp::acceptor acceptor_ipv6
Definition: abstract_tcp_server2.h:519
std::vector< boost::shared_ptr< boost::thread > > m_threads
Definition: abstract_tcp_server2.h:531
boost::asio::ssl::context & get_ssl_context() noexcept
Definition: abstract_tcp_server2.h:406
timers_status_t timers
Definition: abstract_tcp_server2.h:235
std::unique_ptr< void, close > socket
Unique ZMQ socket handle, calls zmq_close on destruction.
Definition: zmq.h:108
virtual bool send_done()
Definition: abstract_tcp_server2.inl:1085
void start_handshake()
Definition: abstract_tcp_server2.inl:206
boost::mutex connections_mutex
Definition: abstract_tcp_server2.h:543
network_throttle_t throttle
Definition: abstract_tcp_server2.h:161
bool is_thread_worker()
Definition: abstract_tcp_server2.inl:1470
void save_dbg_log()
Definition: abstract_tcp_server2.inl:1042
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:1629
ssl_support_t
Definition: net_ssl.h:49
std::set< connection_ptr > connections_
Definition: abstract_tcp_server2.h:544
bool cancel_handshake
Definition: abstract_tcp_server2.h:190
timers_t(io_context_t &io_context)
Definition: abstract_tcp_server2.h:242
void cancel_handler()
Definition: abstract_tcp_server2.inl:633
~boosted_tcp_server()
Definition: abstract_tcp_server2.inl:1210
void on_interrupted()
Definition: abstract_tcp_server2.inl:663
boost::asio::deadline_timer m_timer
Definition: abstract_tcp_server2.h:445
epee::net_utils::network_address default_remote
Definition: abstract_tcp_server2.h:520
i_connection_filter * pfilter
Definition: abstract_tcp_server2.h:281
bool deinit_server()
Definition: abstract_tcp_server2.h:387
void start_write()
Definition: abstract_tcp_server2.inl:448
std::string m_thread_name_prefix
Definition: abstract_tcp_server2.h:529
bool enabled
Definition: abstract_tcp_server2.h:180
io_context_t & m_io_context
Definition: abstract_tcp_server2.h:259
Definition: abstract_tcp_server2.h:154
virtual bool call_handler()
Definition: abstract_tcp_server2.h:457
std::unique_ptr< worker > m_io_context_local_instance
Definition: abstract_tcp_server2.h:514
void async_wait_timer()
Definition: abstract_tcp_server2.inl:168
bool handle_read
Definition: abstract_tcp_server2.h:193
bool cancel_read
Definition: abstract_tcp_server2.h:194
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:1727
bool detected
Definition: abstract_tcp_server2.h:182
boost::asio::io_context::strand strand
Definition: levin_notify.cpp:259
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{})
throttle_t throttle
Definition: abstract_tcp_server2.h:217
boost::thread::id m_main_thread_id
Definition: abstract_tcp_server2.h:532
Definition: abstract_tcp_server2.h:349
bool released
Definition: abstract_tcp_server2.h:222
bool wait_write
Definition: abstract_tcp_server2.h:196
virtual ~connection() noexcept(false)
Definition: abstract_tcp_server2.inl:1010
size_t reference_counter
Definition: abstract_tcp_server2.h:221
bool reset_expire
Definition: abstract_tcp_server2.h:207
stat_t stat
Definition: abstract_tcp_server2.h:237
const std::atomic< bool > & get_stop_signal() const noexcept
Definition: abstract_tcp_server2.h:383
void set_response_soft_limit(std::size_t limit)
Definition: abstract_tcp_server2.inl:1408
Definition: abstract_tcp_server2.h:220
e
Definition: pymoduletest.py:79
timer_status_t out
Definition: abstract_tcp_server2.h:213
void start_read()
Definition: abstract_tcp_server2.inl:322
bool add_idle_handler(t_handler t_callback, uint64_t timeout_ms)
Definition: abstract_tcp_server2.h:465
void start_timer(duration_t duration, bool add={})
Definition: abstract_tcp_server2.inl:144
virtual bool is_remote_host_allowed(const epee::net_utils::network_address &address, time_t *t=NULL)=0
uint64_t m_period
Definition: abstract_tcp_server2.h:461
std::size_t response_soft_limit
Definition: abstract_tcp_server2.h:283
void handle_accept_ipv4(const boost::system::error_code &e)
Handle completion of an asynchronous accept operation.
Definition: abstract_tcp_server2.inl:1521
Definition: abstract_tcp_server2.h:449
boost::asio::ssl::stream_base::handshake_type handshake_t
Definition: abstract_tcp_server2.h:110
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:1225
bool handshaked
Definition: abstract_tcp_server2.h:183
Definition: abstract_tcp_server2.h:151
static void add(ge_p3 &p3, const ge_cached &other)
Definition: multiexp.cc:144
std::map< std::string, t_connection_type > server_type_map
Definition: abstract_tcp_server2.h:362
timer_t::duration duration_t
Definition: abstract_tcp_server2.h:108
data_t data
Definition: abstract_tcp_server2.h:238
bool wait_shutdown
Definition: abstract_tcp_server2.h:200
unsigned int uint32_t
Definition: stdint.h:126
size_t m_threads_count
Definition: abstract_tcp_server2.h:530
Definition: abstract_tcp_server2.h:270
idle_callback_conext_base(boost::asio::io_context &io_serice)
Definition: abstract_tcp_server2.h:442
Definition: abstract_tcp_server2.h:347
struct epee::net_utils::connection::state_t::stat_t::@1 out
io_context_t::strand strand_t
Definition: abstract_tcp_server2.h:113
Definition: abstract_tcp_server2.h:168
boost::shared_ptr< connection< t_protocol_handler > > connection_ptr
Definition: abstract_tcp_server2.h:353
Represents a single connection from a client.
Definition: abstract_tcp_server2.h:95
Definition: abstract_tcp_server2.h:436
bool async_call(t_handler &&t_callback)
Definition: abstract_tcp_server2.h:486
throttle_t throttle
Definition: abstract_tcp_server2.h:256
std::condition_variable_any condition
Definition: abstract_tcp_server2.h:231
boost::asio::io_context & io_context_
Definition: abstract_tcp_server2.h:515
struct epee::net_utils::connection::state_t::stat_t::@0 in
unsigned int host_count(int delta=0)
Definition: abstract_tcp_server2.inl:81
bool send(epee::byte_slice message)
Definition: abstract_tcp_server2.inl:766
unsigned __int64 uint64_t
Definition: stdint.h:136
duration_t get_timeout_from_bytes_read(size_t bytes) const
Definition: abstract_tcp_server2.inl:115
void handle_accept(const boost::system::error_code &e, bool ipv6=false)
Definition: abstract_tcp_server2.inl:1533
Definition: abstract_tcp_server2.h:82
Definition: byte_slice.h:68
int get_binded_port_ipv6()
Definition: abstract_tcp_server2.h:425
std::unique_ptr< void, terminate > context
Unique ZMQ context handle, calls zmq_term on destruction.
Definition: zmq.h:105
virtual ~idle_callback_conext_base()
Definition: abstract_tcp_server2.h:438
Definition: abstract_tcp_server2.h:75
worker()
Definition: abstract_tcp_server2.h:507
boost::system::error_code ec_t
Definition: abstract_tcp_server2.h:109
const std::shared_ptr< typename connection< t_protocol_handler >::shared_state > m_state
Definition: abstract_tcp_server2.h:502
bool wait_consume
Definition: abstract_tcp_server2.h:175
#define false
Definition: stdbool.h:37
#define ABSTRACT_SERVER_SEND_QUE_MAX_BYTES_DEFAULT
Definition: abstract_tcp_server2.h:68
long get_connections_count() const
Definition: abstract_tcp_server2.h:427
bool forced
Definition: abstract_tcp_server2.h:181
int get_binded_port()
Definition: abstract_tcp_server2.h:424
bool wait_init
Definition: abstract_tcp_server2.h:226
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:972
void set_default_remote(epee::net_utils::network_address remote)
Definition: abstract_tcp_server2.h:395
status_t status
Definition: abstract_tcp_server2.h:232
boost::asio::io_context io_context
Definition: abstract_tcp_server2.h:511
void cancel_socket()
Definition: abstract_tcp_server2.inl:607
void set_connection_filter(i_connection_filter *pfilter)
Definition: abstract_tcp_server2.inl:1394
bool cancel()
Definition: abstract_tcp_server2.inl:1073
connection_ptr new_connection_ipv6
Definition: abstract_tcp_server2.h:540
Definition: network_throttle.hpp:98
bool is_stop_signal_sent() const noexcept
Definition: abstract_tcp_server2.h:381
void setRpcStation()
Definition: abstract_tcp_server2.inl:1166
struct epee::net_utils::connection::state_t::data_t::@2 read
boost::asio::ip::tcp::acceptor acceptor_
Acceptor used to listen for incoming connections.
Definition: abstract_tcp_server2.h:518
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:1609
Definition: abstract_tcp_server2.h:204
virtual bool add_ref()
Definition: abstract_tcp_server2.inl:1141
bool wait_read
Definition: abstract_tcp_server2.h:192
Definition: abstract_tcp_server2.h:158
bool timed_wait_server_stop(uint64_t wait_mseconds)
wait for service workers stop
Definition: abstract_tcp_server2.inl:1486
boost::endian::big_uint16_t port
Definition: socks.cpp:61
timer_t general
Definition: abstract_tcp_server2.h:255
timers_t m_timers
Definition: abstract_tcp_server2.h:263
t_protocol_handler::connection_context t_connection_context
Definition: abstract_tcp_server2.h:102
throttle_t(io_context_t &io_context)
Definition: abstract_tcp_server2.h:247
bool initialized
Definition: abstract_tcp_server2.h:223
void set_threads_prefix(const std::string &prefix_name)
Definition: abstract_tcp_server2.inl:1384
void create_server_type_map()
Definition: abstract_tcp_server2.inl:1217
bool m_local
Definition: abstract_tcp_server2.h:265
timer_status_t general
Definition: abstract_tcp_server2.h:216
bool handle_write
Definition: abstract_tcp_server2.h:197
TODO: (mj-xmr) This will be reduced in an another PR.
Definition: byte_slice.h:39
socket_status_t socket
Definition: abstract_tcp_server2.h:233
uint32_t address
Definition: getifaddr.c:269
bool start(bool is_income, bool is_multithreaded)
Start the first asynchronous operation for the connection.
Definition: abstract_tcp_server2.inl:1023
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:1067
Definition: abstract_tcp_server2.h:153
ssl_t ssl
Definition: abstract_tcp_server2.h:234
Definition: abstract_tcp_server2.h:155
Definition: net_utils_base.h:441
const T & move(const T &t)
Definition: gtest-port.h:1317
The io_context used to perform asynchronous operations.
Definition: abstract_tcp_server2.h:505
virtual bool do_send(byte_slice message)
(see do_send from i_service_endpoint)
Definition: abstract_tcp_server2.inl:1079
void get_context(t_connection_context &context_)
Definition: abstract_tcp_server2.h:311
Definition: blake256.h:36
std::mutex lock
Definition: abstract_tcp_server2.h:230
Definition: network_throttle-detail.hpp:48
size_t wait_callback
Definition: abstract_tcp_server2.h:227
Definition: abstract_tcp_server2.h:211
t_connection_type
Definition: connection_basic.hpp:93
std::string m_address
Definition: abstract_tcp_server2.h:525
boost::asio::steady_timer timer_t
Definition: abstract_tcp_server2.h:107
i_connection_limit * plimit
Definition: abstract_tcp_server2.h:282
std::atomic< bool > m_stop_signal_sent
Definition: abstract_tcp_server2.h:522
uint32_t m_port
Definition: abstract_tcp_server2.h:523
Definition: abstract_tcp_server2.h:179
virtual bool release()
Definition: abstract_tcp_server2.inl:1156
virtual io_context_t & get_io_context()
Definition: abstract_tcp_server2.inl:1135
protocol_t protocol
Definition: abstract_tcp_server2.h:236
bool m_require_ipv4
Definition: abstract_tcp_server2.h:528
Definition: abstract_tcp_server2.h:246
bool worker_thread()
Run the server's io_context loop.
Definition: abstract_tcp_server2.inl:1354
bool cancel_shutdown
Definition: abstract_tcp_server2.h:201
connection_ptr new_connection_
The next connection to be accepted.
Definition: abstract_tcp_server2.h:539
status_t
Definition: abstract_tcp_server2.h:150
void start_shutdown()
Definition: abstract_tcp_server2.inl:565
idle_callback_conext(boost::asio::io_context &io_serice, t_handler &h, uint64_t period)
Definition: abstract_tcp_server2.h:451
void state_status_check()
Definition: abstract_tcp_server2.inl:125
std::shared_ptr< typename t_protocol_handler::config_type > get_config_shared()
Definition: abstract_tcp_server2.h:418
void cancel_timer()
Definition: abstract_tcp_server2.inl:196
t_connection_type m_connection_type
Definition: abstract_tcp_server2.h:536
Definition: abstract_tcp_server2.h:152
std::deque< epee::byte_slice > queue
Definition: abstract_tcp_server2.h:173
implementaion for throttling of connection (count and rate-limit speed etc)
bool global_timer_handler(boost::shared_ptr< idle_callback_conext< t_handler >> ptr)
Definition: abstract_tcp_server2.h:475
std::size_t total_bytes
Definition: abstract_tcp_server2.h:174
boost::asio::io_context & get_io_context()
Definition: abstract_tcp_server2.h:434
bool stop_signal_sent
Definition: abstract_tcp_server2.h:284
bool wait_expire
Definition: abstract_tcp_server2.h:205
boost::asio::ip::tcp::socket socket_t
Definition: abstract_tcp_server2.h:114
#define const
Definition: ipfrdr.c:80
tuple message
Definition: gtest_output_test.py:331
static uint64_t h
Definition: blockchain_stats.cpp:55
base for connection, contains e.g. the ratelimit hooks
boost::shared_ptr< connection_t > connection_ptr
Definition: abstract_tcp_server2.h:105
strand_t m_strand
Definition: abstract_tcp_server2.h:262
Definition: connection_basic.hpp:62
bool start_internal(bool is_income, bool is_multithreaded, boost::optional< network_address > real_remote)
Definition: abstract_tcp_server2.inl:869
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:1415
void send_stop_signal()
Stop the server.
Definition: abstract_tcp_server2.inl:1503
boost::asio::io_context io_context_t
Definition: abstract_tcp_server2.h:112
duration_t get_default_timeout()
Definition: abstract_tcp_server2.inl:98
uint32_t m_port_ipv6
Definition: abstract_tcp_server2.h:524
try_connect_result_t
Definition: abstract_tcp_server2.h:345
struct epee::net_utils::connection::state_t::data_t::@3 write
Definition: abstract_tcp_server2.h:159
t_protocol_handler::config_type & get_config_object()
Definition: abstract_tcp_server2.h:412
Definition: abstract_tcp_server2.h:210
void interrupt()
Definition: abstract_tcp_server2.inl:650
Definition: connection_basic.hpp:101
timer_t out
Definition: abstract_tcp_server2.h:252