Monero
abstract_tcp_server2.h
Go to the documentation of this file.
1 
7 // Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
8 // All rights reserved.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are met:
12 // * Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 // * Redistributions in binary form must reproduce the above copyright
15 // notice, this list of conditions and the following disclaimer in the
16 // documentation and/or other materials provided with the distribution.
17 // * Neither the name of the Andrey N. Sabelnikov nor the
18 // names of its contributors may be used to endorse or promote products
19 // derived from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
22 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
25 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 //
32 
33 
34 
35 #ifndef _ABSTRACT_TCP_SERVER2_H_
36 #define _ABSTRACT_TCP_SERVER2_H_
37 
38 
39 #include <string>
40 #include <vector>
41 #include <boost/noncopyable.hpp>
42 #include <boost/shared_ptr.hpp>
43 #include <atomic>
44 #include <cassert>
45 #include <map>
46 #include <memory>
47 #include <condition_variable>
48 
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>
58 #include "byte_slice.h"
59 #include "net_utils_base.h"
60 #include "syncobj.h"
61 #include "connection_basic.hpp"
63 
64 #undef MONERO_DEFAULT_LOG_CATEGORY
65 #define MONERO_DEFAULT_LOG_CATEGORY "net"
66 
67 #define ABSTRACT_SERVER_SEND_QUE_MAX_COUNT 1000
68 #define ABSTRACT_SERVER_SEND_QUE_MAX_BYTES_DEFAULT 100 * 1024 * 1024
69 
70 namespace epee
71 {
72 namespace net_utils
73 {
74 
76  {
77  virtual bool is_remote_host_allowed(const epee::net_utils::network_address &address, time_t *t = NULL)=0;
78  protected:
80  };
81 
83  {
85  protected:
86  virtual ~i_connection_limit(){}
87  };
88 
89 
90  /************************************************************************/
91  /* */
92  /************************************************************************/
94  template<class t_protocol_handler>
95  class connection
96  : public boost::enable_shared_from_this<connection<t_protocol_handler> >,
97  private boost::noncopyable,
98  public i_service_endpoint,
99  public connection_basic
100  {
101  public:
102  typedef typename t_protocol_handler::connection_context t_connection_context;
103  private:
105  using connection_ptr = boost::shared_ptr<connection_t>;
107  using timer_t = boost::asio::steady_timer;
108  using duration_t = timer_t::duration;
109  using ec_t = boost::system::error_code;
110  using handshake_t = boost::asio::ssl::stream_base::handshake_type;
111 
112  using io_context_t = boost::asio::io_context;
115 
118 
119  unsigned int host_count(int delta = 0);
121  duration_t get_timeout_from_bytes_read(size_t bytes) const;
122 
123  void state_status_check();
124 
125  void start_timer(duration_t duration, bool add = {});
126  void async_wait_timer();
127  void cancel_timer();
128 
129  void start_handshake();
130  void start_read();
131  void finish_read(size_t bytes_transferred);
132  void start_write();
133  void start_shutdown();
134  void cancel_socket();
135 
136  void cancel_handler();
137 
138  void interrupt();
139  void on_interrupted();
140 
141  void terminate();
142  void on_terminating();
143  void terminate_async();
144 
146  bool start_internal(
147  bool is_income,
148  bool is_multithreaded,
149  boost::optional<network_address> real_remote
150  );
151 
152  enum status_t {
158  };
159 
160  struct state_t {
161  struct stat_t {
162  struct {
163  network_throttle_t throttle{"speed_in", "throttle_speed_in"};
164  } in;
165  struct {
166  network_throttle_t throttle{"speed_out", "throttle_speed_out"};
167  } out;
168  };
169 
170  struct data_t {
171  struct {
172  std::array<uint8_t, 0x2000> buffer;
173  } read;
174  struct {
175  std::deque<epee::byte_slice> queue;
176  std::size_t total_bytes;
178  } write;
179  };
180 
181  struct ssl_t {
182  bool enabled;
183  bool forced;
184  bool detected;
186  };
187 
189  bool connected;
190 
193 
194  bool wait_read;
198 
202 
205  };
206 
207  struct timer_status_t {
211  };
212 
214  struct throttle_t {
217  };
218 
221  };
222 
223  struct protocol_t {
225  bool released;
227 
229  bool wait_init;
231  };
232 
233  std::mutex lock;
234  std::condition_variable_any condition;
242  };
243 
244  struct timers_t {
245  timers_t(io_context_t &io_context):
246  general(io_context),
247  throttle(io_context)
248  {}
249  struct throttle_t {
250  throttle_t(io_context_t &io_context):
251  in(io_context),
252  out(io_context)
253  {}
256  };
257 
260  };
261 
268  bool m_local{};
271  t_protocol_handler m_handler;
272  public:
273  struct shared_state : connection_basic_shared_state, t_protocol_handler::config_type
274  {
277  t_protocol_handler::config_type(),
278  pfilter(nullptr),
279  plimit(nullptr),
282  {}
283 
286  std::size_t response_soft_limit;
288  };
289 
291  explicit connection( io_context_t& io_context,
292  std::shared_ptr<shared_state> state,
293  t_connection_type connection_type,
294  epee::net_utils::ssl_support_t ssl_support,
296 
297  explicit connection( io_context_t& io_context,
299  std::shared_ptr<shared_state> state,
300  t_connection_type connection_type,
301  epee::net_utils::ssl_support_t ssl_support,
303 
304 
305 
306  virtual ~connection() noexcept(false);
307 
309  bool start(bool is_income, bool is_multithreaded);
310 
311  // `real_remote` is the actual endpoint (if connection is to proxy, etc.)
312  bool start(bool is_income, bool is_multithreaded, network_address real_remote);
313 
314  void get_context(t_connection_context& context_){context_ = m_conn_context;}
315 
316  void call_back_starter();
317 
318  void save_dbg_log();
319 
320 
321  bool speed_limit_is_enabled() const;
322 
323  bool cancel();
324 
325  private:
326  //----------------- i_service_endpoint ---------------------
327  virtual bool do_send(byte_slice message);
328  virtual bool send_done();
329  virtual bool close();
330  virtual bool call_run_once_service_io();
331  virtual bool request_callback();
332  virtual io_context_t& get_io_context();
333  virtual bool add_ref();
334  virtual bool release();
335  //------------------------------------------------------
336  public:
337  void setRpcStation();
338  };
339 
340 
341  /************************************************************************/
342  /* */
343  /************************************************************************/
344  template<class t_protocol_handler>
346  : private boost::noncopyable
347  {
349  {
353  };
354 
355  public:
356  typedef boost::shared_ptr<connection<t_protocol_handler> > connection_ptr;
357  typedef typename t_protocol_handler::connection_context t_connection_context;
360 
361  boosted_tcp_server(t_connection_type connection_type);
362  explicit boosted_tcp_server(boost::asio::io_context& external_io_context, t_connection_type connection_type);
364 
365  std::map<std::string, t_connection_type> server_type_map;
366  void create_server_type_map();
367 
368  bool init_server(uint32_t port, const std::string& address = "0.0.0.0",
369  uint32_t port_ipv6 = 0, const std::string& address_ipv6 = "::", bool use_ipv6 = false, bool require_ipv4 = true,
371  bool init_server(const std::string port, const std::string& address = "0.0.0.0",
372  const std::string port_ipv6 = "", const std::string address_ipv6 = "::", bool use_ipv6 = false, bool require_ipv4 = true,
374 
376  bool run_server(size_t threads_count, bool wait = true, const boost::thread::attributes& attrs = boost::thread::attributes());
377 
379  bool timed_wait_server_stop(uint64_t wait_mseconds);
380 
382  void send_stop_signal();
383 
384  bool is_stop_signal_sent() const noexcept { return m_stop_signal_sent; };
385 
386  const std::atomic<bool>& get_stop_signal() const noexcept { return m_stop_signal_sent; }
387 
388  void set_threads_prefix(const std::string& prefix_name);
389 
390  bool deinit_server(){return true;}
391 
393 
396  void set_response_soft_limit(std::size_t limit);
397 
399  {
400  default_remote = std::move(remote);
401  }
402 
404  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);
406  template<class t_callback>
407  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{});
408 
410  {
411  assert(m_state != nullptr);
412  return m_state->ssl_context;
413  }
414 
415  typename t_protocol_handler::config_type& get_config_object()
416  {
417  assert(m_state != nullptr); // always set in constructor
418  return *m_state;
419  }
420 
421  std::shared_ptr<typename t_protocol_handler::config_type> get_config_shared()
422  {
423  assert(m_state != nullptr); // always set in constructor
424  return {m_state};
425  }
426 
427  int get_binded_port(){return m_port;}
429 
431  {
432  assert(m_state != nullptr); // always set in constructor
433  auto connections_count = m_state->sock_count > 0 ? (m_state->sock_count - 1) : 0; // Socket count minus listening socket
434  return connections_count;
435  }
436 
437  boost::asio::io_context& get_io_context(){return io_context_;}
438 
440  {
442 
443  virtual bool call_handler(){return true;}
444 
445  idle_callback_conext_base(boost::asio::io_context& io_serice):
446  m_timer(io_serice)
447  {}
448  boost::asio::deadline_timer m_timer;
449  };
450 
451  template <class t_handler>
453  {
454  idle_callback_conext(boost::asio::io_context& io_serice, t_handler& h, uint64_t period):
455  idle_callback_conext_base(io_serice),
456  m_handler(h)
457  {this->m_period = period;}
458 
459  t_handler m_handler;
460  virtual bool call_handler()
461  {
462  return m_handler();
463  }
465  };
466 
467  template<class t_handler>
468  bool add_idle_handler(t_handler t_callback, uint64_t timeout_ms)
469  {
470  boost::shared_ptr<idle_callback_conext<t_handler>> ptr(new idle_callback_conext<t_handler>(io_context_, t_callback, timeout_ms));
471  //needed call handler here ?...
472  ptr->m_timer.expires_from_now(boost::posix_time::milliseconds(ptr->m_period));
473  ptr->m_timer.async_wait(boost::bind(&boosted_tcp_server<t_protocol_handler>::global_timer_handler<t_handler>, this, ptr));
474  return true;
475  }
476 
477  template<class t_handler>
478  bool global_timer_handler(/*const boost::system::error_code& err, */boost::shared_ptr<idle_callback_conext<t_handler>> ptr)
479  {
480  //if handler return false - he don't want to be called anymore
481  if(!ptr->call_handler())
482  return true;
483  ptr->m_timer.expires_from_now(boost::posix_time::milliseconds(ptr->m_period));
484  ptr->m_timer.async_wait(boost::bind(&boosted_tcp_server<t_protocol_handler>::global_timer_handler<t_handler>, this, ptr));
485  return true;
486  }
487 
488  template<class t_handler>
489  bool async_call(t_handler&& t_callback)
490  {
491  boost::asio::post(io_context_, std::forward<t_handler>(t_callback));
492  return true;
493  }
494 
495  private:
497  bool worker_thread();
499  void handle_accept_ipv4(const boost::system::error_code& e);
500  void handle_accept_ipv6(const boost::system::error_code& e);
501  void handle_accept(const boost::system::error_code& e, bool ipv6 = false);
502 
503  bool is_thread_worker();
504 
505  const std::shared_ptr<typename connection<t_protocol_handler>::shared_state> m_state;
506 
508  struct worker
509  {
511  : io_context(), work(io_context.get_executor())
512  {}
513 
514  boost::asio::io_context io_context;
515  boost::asio::executor_work_guard<boost::asio::io_context::executor_type> work;
516  };
517  std::unique_ptr<worker> m_io_context_local_instance;
518  boost::asio::io_context& io_context_;
519 
521  boost::asio::ip::tcp::acceptor acceptor_;
522  boost::asio::ip::tcp::acceptor acceptor_ipv6;
524 
525  std::atomic<bool> m_stop_signal_sent;
532  std::string m_thread_name_prefix; //TODO: change to enum server_type, now used
534  std::vector<boost::shared_ptr<boost::thread> > m_threads;
537  std::atomic<uint32_t> m_thread_index;
538 
540 
544 
545 
546  boost::mutex connections_mutex;
547  std::set<connection_ptr> connections_;
548  }; // class <>boosted_tcp_server
549 
550 
551 } // namespace
552 } // namespace
553 
554 #include "abstract_tcp_server2.inl"
555 
556 #endif
boost::asio::executor_work_guard< boost::asio::io_context::executor_type > work
Definition: abstract_tcp_server2.h:515
void handle_accept_ipv6(const boost::system::error_code &e)
Definition: abstract_tcp_server2.inl:1567
t_connection_context m_conn_context
Definition: abstract_tcp_server2.h:264
virtual bool request_callback()
Definition: abstract_tcp_server2.inl:1155
virtual ~i_connection_limit()
Definition: abstract_tcp_server2.h:86
state_t m_state
Definition: abstract_tcp_server2.h:270
void on_terminating()
Definition: abstract_tcp_server2.inl:757
virtual bool call_handler()
Definition: abstract_tcp_server2.h:443
size_t get_threads_count()
Definition: abstract_tcp_server2.h:392
void terminate()
Definition: abstract_tcp_server2.inl:742
bool m_use_ipv6
Definition: abstract_tcp_server2.h:530
Definition: net_ssl.h:76
virtual ~i_connection_filter()
Definition: abstract_tcp_server2.h:79
bool cancel_expire
Definition: abstract_tcp_server2.h:209
t_protocol_handler::connection_context t_connection_context
Definition: abstract_tcp_server2.h:357
timer_t in
Definition: abstract_tcp_server2.h:254
void set_connection_limit(i_connection_limit *plimit)
Definition: abstract_tcp_server2.inl:1441
virtual bool call_run_once_service_io()
Definition: abstract_tcp_server2.inl:1141
Definition: abstract_tcp_server2.h:345
virtual bool close()
Definition: abstract_tcp_server2.inl:1131
void finish_read(size_t bytes_transferred)
Definition: abstract_tcp_server2.inl:413
t_handler m_handler
Definition: abstract_tcp_server2.h:459
shared_state()
Definition: abstract_tcp_server2.h:275
virtual bool is_host_limit(const epee::net_utils::network_address &address)=0
Definition: abstract_tcp_server2.h:244
boosted_tcp_server(t_connection_type connection_type)
Definition: abstract_tcp_server2.inl:1213
std::string m_address_ipv6
Definition: abstract_tcp_server2.h:529
bool wait_handshake
Definition: abstract_tcp_server2.h:191
critical_section m_threads_lock
Definition: abstract_tcp_server2.h:536
t_protocol_handler m_handler
Definition: abstract_tcp_server2.h:271
enum upnpconfigoptions id
Definition: options.c:29
bool cancel_write
Definition: abstract_tcp_server2.h:201
Definition: abstract_tcp_server2.h:351
::std::string string
Definition: gtest-port.h:1097
Definition: net_utils_base.h:224
bool wait_release
Definition: abstract_tcp_server2.h:228
the connection templated-class for one peer connection
t
Definition: console.py:33
bool connected
Definition: abstract_tcp_server2.h:189
std::atomic< uint32_t > m_thread_index
Definition: abstract_tcp_server2.h:537
std::array< uint8_t, 0x2000 > buffer
Definition: abstract_tcp_server2.h:172
timer_status_t in
Definition: abstract_tcp_server2.h:215
Definition: abstract_tcp_server2.h:188
std::string m_host
Definition: abstract_tcp_server2.h:269
t_connection_type m_connection_type
Definition: abstract_tcp_server2.h:263
boost::asio::ip::tcp::acceptor acceptor_ipv6
Definition: abstract_tcp_server2.h:522
std::vector< boost::shared_ptr< boost::thread > > m_threads
Definition: abstract_tcp_server2.h:534
boost::asio::ssl::context & get_ssl_context() noexcept
Definition: abstract_tcp_server2.h:409
timers_status_t timers
Definition: abstract_tcp_server2.h:238
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:1125
void start_handshake()
Definition: abstract_tcp_server2.inl:209
boost::mutex connections_mutex
Definition: abstract_tcp_server2.h:546
network_throttle_t throttle
Definition: abstract_tcp_server2.h:163
bool is_thread_worker()
Definition: abstract_tcp_server2.inl:1510
void save_dbg_log()
Definition: abstract_tcp_server2.inl:1082
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
ssl_support_t
Definition: net_ssl.h:49
std::set< connection_ptr > connections_
Definition: abstract_tcp_server2.h:547
bool cancel_handshake
Definition: abstract_tcp_server2.h:192
timers_t(io_context_t &io_context)
Definition: abstract_tcp_server2.h:245
void cancel_handler()
Definition: abstract_tcp_server2.inl:667
~boosted_tcp_server()
Definition: abstract_tcp_server2.inl:1250
void on_interrupted()
Definition: abstract_tcp_server2.inl:697
boost::asio::deadline_timer m_timer
Definition: abstract_tcp_server2.h:448
epee::net_utils::network_address default_remote
Definition: abstract_tcp_server2.h:523
i_connection_filter * pfilter
Definition: abstract_tcp_server2.h:284
bool deinit_server()
Definition: abstract_tcp_server2.h:390
void start_write()
Definition: abstract_tcp_server2.inl:469
std::string m_thread_name_prefix
Definition: abstract_tcp_server2.h:532
bool enabled
Definition: abstract_tcp_server2.h:182
io_context_t & m_io_context
Definition: abstract_tcp_server2.h:262
Definition: abstract_tcp_server2.h:156
virtual bool call_handler()
Definition: abstract_tcp_server2.h:460
std::unique_ptr< worker > m_io_context_local_instance
Definition: abstract_tcp_server2.h:517
void async_wait_timer()
Definition: abstract_tcp_server2.inl:168
bool handle_read
Definition: abstract_tcp_server2.h:195
bool cancel_read
Definition: abstract_tcp_server2.h:196
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 detected
Definition: abstract_tcp_server2.h:184
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:220
boost::thread::id m_main_thread_id
Definition: abstract_tcp_server2.h:535
Definition: abstract_tcp_server2.h:352
bool released
Definition: abstract_tcp_server2.h:225
bool wait_write
Definition: abstract_tcp_server2.h:199
virtual ~connection() noexcept(false)
Definition: abstract_tcp_server2.inl:1050
size_t reference_counter
Definition: abstract_tcp_server2.h:224
bool reset_expire
Definition: abstract_tcp_server2.h:210
stat_t stat
Definition: abstract_tcp_server2.h:240
const std::atomic< bool > & get_stop_signal() const noexcept
Definition: abstract_tcp_server2.h:386
void set_response_soft_limit(std::size_t limit)
Definition: abstract_tcp_server2.inl:1448
Definition: abstract_tcp_server2.h:223
e
Definition: pymoduletest.py:79
timer_status_t out
Definition: abstract_tcp_server2.h:216
void start_read()
Definition: abstract_tcp_server2.inl:305
bool add_idle_handler(t_handler t_callback, uint64_t timeout_ms)
Definition: abstract_tcp_server2.h:468
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:464
std::size_t response_soft_limit
Definition: abstract_tcp_server2.h:286
Definition: syncobj.h:81
void handle_accept_ipv4(const boost::system::error_code &e)
Handle completion of an asynchronous accept operation.
Definition: abstract_tcp_server2.inl:1561
Definition: abstract_tcp_server2.h:452
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:1265
bool handshaked
Definition: abstract_tcp_server2.h:185
Definition: abstract_tcp_server2.h:153
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:365
timer_t::duration duration_t
Definition: abstract_tcp_server2.h:108
data_t data
Definition: abstract_tcp_server2.h:241
bool wait_shutdown
Definition: abstract_tcp_server2.h:203
unsigned int uint32_t
Definition: stdint.h:126
size_t m_threads_count
Definition: abstract_tcp_server2.h:533
Definition: abstract_tcp_server2.h:273
idle_callback_conext_base(boost::asio::io_context &io_serice)
Definition: abstract_tcp_server2.h:445
Definition: abstract_tcp_server2.h:350
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:170
boost::shared_ptr< connection< t_protocol_handler > > connection_ptr
Definition: abstract_tcp_server2.h:356
void terminate_async()
Definition: abstract_tcp_server2.inl:800
Represents a single connection from a client.
Definition: abstract_tcp_server2.h:95
bool async_call(t_handler &&t_callback)
Definition: abstract_tcp_server2.h:489
throttle_t throttle
Definition: abstract_tcp_server2.h:259
std::condition_variable_any condition
Definition: abstract_tcp_server2.h:234
boost::asio::io_context & io_context_
Definition: abstract_tcp_server2.h:518
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:811
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:1573
Definition: abstract_tcp_server2.h:82
Definition: byte_slice.h:68
int get_binded_port_ipv6()
Definition: abstract_tcp_server2.h:428
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:441
Definition: abstract_tcp_server2.h:75
worker()
Definition: abstract_tcp_server2.h:510
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:505
bool wait_consume
Definition: abstract_tcp_server2.h:177
#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:430
bool forced
Definition: abstract_tcp_server2.h:183
int get_binded_port()
Definition: abstract_tcp_server2.h:427
bool wait_init
Definition: abstract_tcp_server2.h:229
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 set_default_remote(epee::net_utils::network_address remote)
Definition: abstract_tcp_server2.h:398
status_t status
Definition: abstract_tcp_server2.h:235
boost::asio::io_context io_context
Definition: abstract_tcp_server2.h:514
void cancel_socket()
Definition: abstract_tcp_server2.inl:641
void set_connection_filter(i_connection_filter *pfilter)
Definition: abstract_tcp_server2.inl:1434
bool cancel()
Definition: abstract_tcp_server2.inl:1113
connection_ptr new_connection_ipv6
Definition: abstract_tcp_server2.h:543
Definition: network_throttle.hpp:98
bool is_stop_signal_sent() const noexcept
Definition: abstract_tcp_server2.h:384
void setRpcStation()
Definition: abstract_tcp_server2.inl:1206
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:521
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
Definition: abstract_tcp_server2.h:207
virtual bool add_ref()
Definition: abstract_tcp_server2.inl:1181
bool wait_read
Definition: abstract_tcp_server2.h:194
Definition: abstract_tcp_server2.h:160
bool timed_wait_server_stop(uint64_t wait_mseconds)
wait for service workers stop
Definition: abstract_tcp_server2.inl:1526
boost::endian::big_uint16_t port
Definition: socks.cpp:61
timer_t general
Definition: abstract_tcp_server2.h:258
timers_t m_timers
Definition: abstract_tcp_server2.h:266
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:250
bool initialized
Definition: abstract_tcp_server2.h:226
void set_threads_prefix(const std::string &prefix_name)
Definition: abstract_tcp_server2.inl:1424
void create_server_type_map()
Definition: abstract_tcp_server2.inl:1257
bool m_local
Definition: abstract_tcp_server2.h:268
timer_status_t general
Definition: abstract_tcp_server2.h:219
bool handle_write
Definition: abstract_tcp_server2.h:200
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:236
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:1063
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
Definition: abstract_tcp_server2.h:155
ssl_t ssl
Definition: abstract_tcp_server2.h:237
Definition: abstract_tcp_server2.h:157
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:508
virtual bool do_send(byte_slice message)
(see do_send from i_service_endpoint)
Definition: abstract_tcp_server2.inl:1119
void get_context(t_connection_context &context_)
Definition: abstract_tcp_server2.h:314
Definition: blake256.h:36
std::mutex lock
Definition: abstract_tcp_server2.h:233
Definition: network_throttle-detail.hpp:48
size_t wait_callback
Definition: abstract_tcp_server2.h:230
t_connection_type
Definition: connection_basic.hpp:93
std::string m_address
Definition: abstract_tcp_server2.h:528
boost::asio::steady_timer timer_t
Definition: abstract_tcp_server2.h:107
i_connection_limit * plimit
Definition: abstract_tcp_server2.h:285
std::atomic< bool > m_stop_signal_sent
Definition: abstract_tcp_server2.h:525
uint32_t m_port
Definition: abstract_tcp_server2.h:526
Definition: abstract_tcp_server2.h:181
virtual bool release()
Definition: abstract_tcp_server2.inl:1196
virtual io_context_t & get_io_context()
Definition: abstract_tcp_server2.inl:1175
protocol_t protocol
Definition: abstract_tcp_server2.h:239
bool m_require_ipv4
Definition: abstract_tcp_server2.h:531
Definition: abstract_tcp_server2.h:249
bool worker_thread()
Run the server&#39;s io_context loop.
Definition: abstract_tcp_server2.inl:1394
bool cancel_shutdown
Definition: abstract_tcp_server2.h:204
connection_ptr new_connection_
The next connection to be accepted.
Definition: abstract_tcp_server2.h:542
status_t
Definition: abstract_tcp_server2.h:152
void start_shutdown()
Definition: abstract_tcp_server2.inl:599
idle_callback_conext(boost::asio::io_context &io_serice, t_handler &h, uint64_t period)
Definition: abstract_tcp_server2.h:454
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:421
void cancel_timer()
Definition: abstract_tcp_server2.inl:199
t_connection_type m_connection_type
Definition: abstract_tcp_server2.h:539
Definition: abstract_tcp_server2.h:154
std::deque< epee::byte_slice > queue
Definition: abstract_tcp_server2.h:175
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:478
std::size_t total_bytes
Definition: abstract_tcp_server2.h:176
boost::asio::io_context & get_io_context()
Definition: abstract_tcp_server2.h:437
bool shutdown_read
Definition: abstract_tcp_server2.h:197
bool stop_signal_sent
Definition: abstract_tcp_server2.h:287
bool wait_expire
Definition: abstract_tcp_server2.h:208
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:265
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:909
bool run_server(size_t threads_count, bool wait=true, const boost::thread::attributes &attrs=boost::thread::attributes())
Run the server&#39;s io_context loop.
Definition: abstract_tcp_server2.inl:1455
void send_stop_signal()
Stop the server.
Definition: abstract_tcp_server2.inl:1543
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:527
struct epee::net_utils::connection::state_t::data_t::@3 write
Definition: abstract_tcp_server2.h:161
t_protocol_handler::config_type & get_config_object()
Definition: abstract_tcp_server2.h:415
Definition: abstract_tcp_server2.h:213
void interrupt()
Definition: abstract_tcp_server2.inl:684
Definition: connection_basic.hpp:101
timer_t out
Definition: abstract_tcp_server2.h:255