diff options
| author | tobtoht <tob@featherwallet.org> | 2025-02-15 04:48:18 +0000 |
|---|---|---|
| committer | tobtoht <tob@featherwallet.org> | 2025-02-15 04:48:18 +0000 |
| commit | be0efaf7f6a97d437381b7988f6dfcedb89cb4af (patch) | |
| tree | 7aa82581901a978c3c7ba3b0f50ac8c84f753945 /contrib | |
| parent | 23a11d851adef30aea1888da0a7dd23936c81ec1 (diff) | |
| parent | 01bcd52924244ec8d2a24c10fcef8959289d09ff (diff) | |
| download | monzero-core-be0efaf7f6a97d437381b7988f6dfcedb89cb4af.tar.gz monzero-core-be0efaf7f6a97d437381b7988f6dfcedb89cb4af.tar.xz monzero-core-be0efaf7f6a97d437381b7988f6dfcedb89cb4af.zip | |
Merge pull request #9800
01bcd5292 Fix build with boost ASIO 0.87. Support boost 1.66+ (Lee *!* Clagett)
Diffstat (limited to 'contrib')
| -rw-r--r-- | contrib/brew/Brewfile | 2 | ||||
| -rw-r--r-- | contrib/epee/include/net/abstract_tcp_server2.h | 44 | ||||
| -rw-r--r-- | contrib/epee/include/net/abstract_tcp_server2.inl | 208 | ||||
| -rw-r--r-- | contrib/epee/include/net/connection_basic.hpp | 9 | ||||
| -rw-r--r-- | contrib/epee/include/net/http_server_impl_base.h | 2 | ||||
| -rw-r--r-- | contrib/epee/include/net/levin_protocol_handler_async.h | 2 | ||||
| -rw-r--r-- | contrib/epee/include/net/net_helper.h | 141 | ||||
| -rw-r--r-- | contrib/epee/include/net/net_ssl.h | 3 | ||||
| -rw-r--r-- | contrib/epee/include/net/net_utils_base.h | 10 | ||||
| -rw-r--r-- | contrib/epee/src/connection_basic.cpp | 18 | ||||
| -rw-r--r-- | contrib/epee/src/net_helper.cpp | 49 | ||||
| -rw-r--r-- | contrib/epee/src/net_ssl.cpp | 22 |
12 files changed, 211 insertions, 299 deletions
diff --git a/contrib/brew/Brewfile b/contrib/brew/Brewfile index a159345cf..c74e7b2a2 100644 --- a/contrib/brew/Brewfile +++ b/contrib/brew/Brewfile @@ -16,7 +16,7 @@ brew "binutils" brew "coreutils" brew "cmake" brew "pkg-config" -brew "boost@1.85", link: true +brew "boost" brew "openssl" brew "hidapi" brew "zmq" diff --git a/contrib/epee/include/net/abstract_tcp_server2.h b/contrib/epee/include/net/abstract_tcp_server2.h index 952a6a3cf..1e45e6809 100644 --- a/contrib/epee/include/net/abstract_tcp_server2.h +++ b/contrib/epee/include/net/abstract_tcp_server2.h @@ -47,6 +47,7 @@ #include <condition_variable> #include <boost/asio.hpp> +#include <boost/asio/post.hpp> #include <boost/asio/ssl.hpp> #include <boost/asio/strand.hpp> #include <boost/asio/steady_timer.hpp> @@ -108,8 +109,8 @@ namespace net_utils using ec_t = boost::system::error_code; using handshake_t = boost::asio::ssl::stream_base::handshake_type; - using io_context_t = boost::asio::io_service; - using strand_t = boost::asio::io_service::strand; + using io_context_t = boost::asio::io_context; + using strand_t = io_context_t::strand; using socket_t = boost::asio::ip::tcp::socket; using network_throttle_t = epee::net_utils::network_throttle; @@ -283,13 +284,14 @@ namespace net_utils bool stop_signal_sent; }; - /// Construct a connection with the given io_service. - explicit connection( boost::asio::io_service& io_service, + /// Construct a connection with the given io_context. + explicit 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); - explicit connection( boost::asio::ip::tcp::socket&& sock, + explicit 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); @@ -322,7 +324,7 @@ namespace net_utils virtual bool close(); virtual bool call_run_once_service_io(); virtual bool request_callback(); - virtual boost::asio::io_service& get_io_service(); + virtual io_context_t& get_io_context(); virtual bool add_ref(); virtual bool release(); //------------------------------------------------------ @@ -352,7 +354,7 @@ namespace net_utils /// serve up files from the given directory. boosted_tcp_server(t_connection_type connection_type); - explicit boosted_tcp_server(boost::asio::io_service& external_io_service, t_connection_type connection_type); + explicit boosted_tcp_server(boost::asio::io_context& external_io_context, t_connection_type connection_type); ~boosted_tcp_server(); std::map<std::string, t_connection_type> server_type_map; @@ -365,7 +367,7 @@ namespace net_utils 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); - /// Run the server's io_service loop. + /// Run the server's io_context loop. bool run_server(size_t threads_count, bool wait = true, const boost::thread::attributes& attrs = boost::thread::attributes()); /// wait for service workers stop @@ -427,7 +429,7 @@ namespace net_utils return connections_count; } - boost::asio::io_service& get_io_service(){return io_service_;} + boost::asio::io_context& get_io_context(){return io_context_;} struct idle_callback_conext_base { @@ -435,7 +437,7 @@ namespace net_utils virtual bool call_handler(){return true;} - idle_callback_conext_base(boost::asio::io_service& io_serice): + idle_callback_conext_base(boost::asio::io_context& io_serice): m_timer(io_serice) {} boost::asio::deadline_timer m_timer; @@ -444,7 +446,7 @@ namespace net_utils template <class t_handler> struct idle_callback_conext: public idle_callback_conext_base { - idle_callback_conext(boost::asio::io_service& io_serice, t_handler& h, uint64_t period): + idle_callback_conext(boost::asio::io_context& io_serice, t_handler& h, uint64_t period): idle_callback_conext_base(io_serice), m_handler(h) {this->m_period = period;} @@ -460,7 +462,7 @@ namespace net_utils template<class t_handler> bool add_idle_handler(t_handler t_callback, uint64_t timeout_ms) { - boost::shared_ptr<idle_callback_conext<t_handler>> ptr(new idle_callback_conext<t_handler>(io_service_, t_callback, timeout_ms)); + boost::shared_ptr<idle_callback_conext<t_handler>> ptr(new idle_callback_conext<t_handler>(io_context_, t_callback, timeout_ms)); //needed call handler here ?... ptr->m_timer.expires_from_now(boost::posix_time::milliseconds(ptr->m_period)); ptr->m_timer.async_wait(boost::bind(&boosted_tcp_server<t_protocol_handler>::global_timer_handler<t_handler>, this, ptr)); @@ -479,14 +481,14 @@ namespace net_utils } template<class t_handler> - bool async_call(t_handler t_callback) + bool async_call(t_handler&& t_callback) { - io_service_.post(t_callback); + boost::asio::post(io_context_, std::forward<t_handler>(t_callback)); return true; } private: - /// Run the server's io_service loop. + /// Run the server's io_context loop. bool worker_thread(); /// Handle completion of an asynchronous accept operation. void handle_accept_ipv4(const boost::system::error_code& e); @@ -497,18 +499,18 @@ namespace net_utils const std::shared_ptr<typename connection<t_protocol_handler>::shared_state> m_state; - /// The io_service used to perform asynchronous operations. + /// The io_context used to perform asynchronous operations. struct worker { worker() - : io_service(), work(io_service) + : io_context(), work(io_context.get_executor()) {} - boost::asio::io_service io_service; - boost::asio::io_service::work work; + boost::asio::io_context io_context; + boost::asio::executor_work_guard<boost::asio::io_context::executor_type> work; }; - std::unique_ptr<worker> m_io_service_local_instance; - boost::asio::io_service& io_service_; + std::unique_ptr<worker> m_io_context_local_instance; + boost::asio::io_context& io_context_; /// Acceptor used to listen for incoming connections. boost::asio::ip::tcp::acceptor acceptor_; diff --git a/contrib/epee/include/net/abstract_tcp_server2.inl b/contrib/epee/include/net/abstract_tcp_server2.inl index c3c25825a..39a58d1b2 100644 --- a/contrib/epee/include/net/abstract_tcp_server2.inl +++ b/contrib/epee/include/net/abstract_tcp_server2.inl @@ -31,11 +31,12 @@ // - +#include <boost/asio/post.hpp> #include <boost/foreach.hpp> #include <boost/uuid/random_generator.hpp> #include <boost/chrono.hpp> #include <boost/utility/value_init.hpp> +#include <boost/asio/bind_executor.hpp> #include <boost/asio/deadline_timer.hpp> #include <boost/date_time/posix_time/posix_time.hpp> // TODO #include <boost/thread/condition_variable.hpp> // TODO @@ -145,23 +146,19 @@ namespace net_utils if (m_state.timers.general.wait_expire) { m_state.timers.general.cancel_expire = true; m_state.timers.general.reset_expire = true; - ec_t ec; - m_timers.general.expires_from_now( + m_timers.general.expires_after( std::min( - duration + (add ? m_timers.general.expires_from_now() : duration_t{}), + duration + (add ? (m_timers.general.expiry() - std::chrono::steady_clock::now()) : duration_t{}), get_default_timeout() - ), - ec + ) ); } else { - ec_t ec; - m_timers.general.expires_from_now( + m_timers.general.expires_after( std::min( - duration + (add ? m_timers.general.expires_from_now() : duration_t{}), + duration + (add ? (m_timers.general.expiry() - std::chrono::steady_clock::now()) : duration_t{}), get_default_timeout() - ), - ec + ) ); async_wait_timer(); } @@ -202,8 +199,7 @@ namespace net_utils return; m_state.timers.general.cancel_expire = true; m_state.timers.general.reset_expire = false; - ec_t ec; - m_timers.general.cancel(ec); + m_timers.general.cancel(); } template<typename T> @@ -225,7 +221,8 @@ namespace net_utils m_state.data.read.buffer.size() ), boost::asio::transfer_exactly(epee::net_utils::get_ssl_magic_size()), - m_strand.wrap( + boost::asio::bind_executor( + m_strand, [this, self](const ec_t &ec, size_t bytes_transferred){ std::lock_guard<std::mutex> guard(m_state.lock); m_state.socket.wait_read = false; @@ -246,7 +243,8 @@ namespace net_utils ) { m_state.ssl.enabled = false; m_state.socket.handle_read = true; - connection_basic::strand_.post( + boost::asio::post( + connection_basic::strand_, [this, self, bytes_transferred]{ bool success = m_handler.handle_recv( reinterpret_cast<char *>(m_state.data.read.buffer.data()), @@ -304,7 +302,8 @@ namespace net_utils static_cast<shared_state&>( connection_basic::get_state() ).ssl_options().configure(connection_basic::socket_, handshake); - m_strand.post( + boost::asio::post( + m_strand, [this, self, on_handshake]{ connection_basic::socket_.async_handshake( handshake, @@ -313,7 +312,7 @@ namespace net_utils m_state.ssl.forced ? 0 : epee::net_utils::get_ssl_magic_size() ), - m_strand.wrap(on_handshake) + boost::asio::bind_executor(m_strand, on_handshake) ); } ); @@ -345,8 +344,7 @@ namespace net_utils }; const auto duration = calc_duration(); if (duration > duration_t{}) { - ec_t ec; - m_timers.throttle.in.expires_from_now(duration, ec); + m_timers.throttle.in.expires_after(duration); m_state.timers.throttle.in.wait_expire = true; m_timers.throttle.in.async_wait([this, self](const ec_t &ec){ std::lock_guard<std::mutex> guard(m_state.lock); @@ -401,7 +399,8 @@ namespace net_utils // writes until the connection terminates without deadlocking waiting // for handle_recv. m_state.socket.handle_read = true; - connection_basic::strand_.post( + boost::asio::post( + connection_basic::strand_, [this, self, bytes_transferred]{ bool success = m_handler.handle_recv( reinterpret_cast<char *>(m_state.data.read.buffer.data()), @@ -428,17 +427,18 @@ namespace net_utils m_state.data.read.buffer.data(), m_state.data.read.buffer.size() ), - m_strand.wrap(on_read) + boost::asio::bind_executor(m_strand, on_read) ); else - m_strand.post( + boost::asio::post( + m_strand, [this, self, on_read]{ connection_basic::socket_.async_read_some( boost::asio::buffer( m_state.data.read.buffer.data(), m_state.data.read.buffer.size() ), - m_strand.wrap(on_read) + boost::asio::bind_executor(m_strand, on_read) ); } ); @@ -473,8 +473,7 @@ namespace net_utils }; const auto duration = calc_duration(); if (duration > duration_t{}) { - ec_t ec; - m_timers.throttle.out.expires_from_now(duration, ec); + m_timers.throttle.out.expires_after(duration); m_state.timers.throttle.out.wait_expire = true; m_timers.throttle.out.async_wait([this, self](const ec_t &ec){ std::lock_guard<std::mutex> guard(m_state.lock); @@ -544,10 +543,11 @@ namespace net_utils m_state.data.write.queue.back().data(), m_state.data.write.queue.back().size() ), - m_strand.wrap(on_write) + boost::asio::bind_executor(m_strand, on_write) ); else - m_strand.post( + boost::asio::post( + m_strand, [this, self, on_write]{ boost::asio::async_write( connection_basic::socket_, @@ -555,7 +555,7 @@ namespace net_utils m_state.data.write.queue.back().data(), m_state.data.write.queue.back().size() ), - m_strand.wrap(on_write) + boost::asio::bind_executor(m_strand, on_write) ); } ); @@ -592,10 +592,11 @@ namespace net_utils terminate(); } }; - m_strand.post( + boost::asio::post( + m_strand, [this, self, on_shutdown]{ connection_basic::socket_.async_shutdown( - m_strand.wrap(on_shutdown) + boost::asio::bind_executor(m_strand, on_shutdown) ); } ); @@ -610,15 +611,13 @@ namespace net_utils wait_socket = m_state.socket.cancel_handshake = true; if (m_state.timers.throttle.in.wait_expire) { m_state.timers.throttle.in.cancel_expire = true; - ec_t ec; - m_timers.throttle.in.cancel(ec); + m_timers.throttle.in.cancel(); } if (m_state.socket.wait_read) wait_socket = m_state.socket.cancel_read = true; if (m_state.timers.throttle.out.wait_expire) { m_state.timers.throttle.out.cancel_expire = true; - ec_t ec; - m_timers.throttle.out.cancel(ec); + m_timers.throttle.out.cancel(); } if (m_state.socket.wait_write) wait_socket = m_state.socket.cancel_write = true; @@ -892,7 +891,7 @@ namespace net_utils ipv4_network_address{ uint32_t{ boost::asio::detail::socket_ops::host_to_network_long( - endpoint.address().to_v4().to_ulong() + endpoint.address().to_v4().to_uint() ) }, endpoint.port() @@ -977,7 +976,8 @@ namespace net_utils ssl_support_t ssl_support ): connection( - std::move(socket_t{io_context}), + io_context, + socket_t{io_context}, std::move(shared_state), connection_type, ssl_support @@ -987,15 +987,16 @@ namespace net_utils template<typename T> connection<T>::connection( + io_context_t &io_context, socket_t &&socket, std::shared_ptr<shared_state> shared_state, t_connection_type connection_type, ssl_support_t ssl_support ): - connection_basic(std::move(socket), shared_state, ssl_support), + connection_basic(io_context, std::move(socket), shared_state, ssl_support), m_handler(this, *shared_state, m_conn_context), m_connection_type(connection_type), - m_io_context{GET_IO_SERVICE(connection_basic::socket_)}, + m_io_context{io_context}, m_strand{m_io_context}, m_timers{m_io_context} { @@ -1114,7 +1115,7 @@ namespace net_utils return false; auto self = connection<T>::shared_from_this(); ++m_state.protocol.wait_callback; - connection_basic::strand_.post([this, self]{ + boost::asio::post(connection_basic::strand_, [this, self]{ m_handler.handle_qued_callback(); std::lock_guard<std::mutex> guard(m_state.lock); --m_state.protocol.wait_callback; @@ -1127,7 +1128,7 @@ namespace net_utils } template<typename T> - typename connection<T>::io_context_t &connection<T>::get_io_service() + typename connection<T>::io_context_t &connection<T>::get_io_context() { return m_io_context; } @@ -1167,10 +1168,10 @@ namespace net_utils template<class t_protocol_handler> boosted_tcp_server<t_protocol_handler>::boosted_tcp_server( t_connection_type connection_type ) : m_state(std::make_shared<typename connection<t_protocol_handler>::shared_state>()), - m_io_service_local_instance(new worker()), - io_service_(m_io_service_local_instance->io_service), - acceptor_(io_service_), - acceptor_ipv6(io_service_), + m_io_context_local_instance(new worker()), + io_context_(m_io_context_local_instance->io_context), + acceptor_(io_context_), + acceptor_ipv6(io_context_), default_remote(), m_stop_signal_sent(false), m_port(0), m_threads_count(0), @@ -1184,11 +1185,11 @@ namespace net_utils } template<class t_protocol_handler> - boosted_tcp_server<t_protocol_handler>::boosted_tcp_server(boost::asio::io_service& extarnal_io_service, t_connection_type connection_type) : + boosted_tcp_server<t_protocol_handler>::boosted_tcp_server(boost::asio::io_context& extarnal_io_context, t_connection_type connection_type) : m_state(std::make_shared<typename connection<t_protocol_handler>::shared_state>()), - io_service_(extarnal_io_service), - acceptor_(io_service_), - acceptor_ipv6(io_service_), + io_context_(extarnal_io_context), + acceptor_(io_context_), + acceptor_ipv6(io_context_), default_remote(), m_stop_signal_sent(false), m_port(0), m_threads_count(0), @@ -1235,24 +1236,27 @@ namespace net_utils std::string ipv4_failed = ""; std::string ipv6_failed = ""; + + boost::asio::ip::tcp::resolver resolver(io_context_); + try { - boost::asio::ip::tcp::resolver resolver(io_service_); - boost::asio::ip::tcp::resolver::query query(address, boost::lexical_cast<std::string>(port), boost::asio::ip::tcp::resolver::query::canonical_name); - boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query); - acceptor_.open(endpoint.protocol()); + const auto results = resolver.resolve( + address, boost::lexical_cast<std::string>(port), boost::asio::ip::tcp::resolver::canonical_name + ); + acceptor_.open(results.begin()->endpoint().protocol()); #if !defined(_WIN32) acceptor_.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); #endif - acceptor_.bind(endpoint); + acceptor_.bind(*results.begin()); acceptor_.listen(); boost::asio::ip::tcp::endpoint binded_endpoint = acceptor_.local_endpoint(); m_port = binded_endpoint.port(); MDEBUG("start accept (IPv4)"); - new_connection_.reset(new connection<t_protocol_handler>(io_service_, m_state, m_connection_type, m_state->ssl_options().support)); + new_connection_.reset(new connection<t_protocol_handler>(io_context_, m_state, m_connection_type, m_state->ssl_options().support)); acceptor_.async_accept(new_connection_->socket(), - boost::bind(&boosted_tcp_server<t_protocol_handler>::handle_accept_ipv4, this, - boost::asio::placeholders::error)); + boost::bind(&boosted_tcp_server<t_protocol_handler>::handle_accept_ipv4, this, + boost::asio::placeholders::error)); } catch (const std::exception &e) { @@ -1273,23 +1277,25 @@ namespace net_utils try { if (port_ipv6 == 0) port_ipv6 = port; // default arg means bind to same port as ipv4 - boost::asio::ip::tcp::resolver resolver(io_service_); - boost::asio::ip::tcp::resolver::query query(address_ipv6, boost::lexical_cast<std::string>(port_ipv6), boost::asio::ip::tcp::resolver::query::canonical_name); - boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query); - acceptor_ipv6.open(endpoint.protocol()); + + const auto results = resolver.resolve( + address_ipv6, boost::lexical_cast<std::string>(port_ipv6), boost::asio::ip::tcp::resolver::canonical_name + ); + + acceptor_ipv6.open(results.begin()->endpoint().protocol()); #if !defined(_WIN32) acceptor_ipv6.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); #endif acceptor_ipv6.set_option(boost::asio::ip::v6_only(true)); - acceptor_ipv6.bind(endpoint); + acceptor_ipv6.bind(*results.begin()); acceptor_ipv6.listen(); boost::asio::ip::tcp::endpoint binded_endpoint = acceptor_ipv6.local_endpoint(); m_port_ipv6 = binded_endpoint.port(); MDEBUG("start accept (IPv6)"); - new_connection_ipv6.reset(new connection<t_protocol_handler>(io_service_, m_state, m_connection_type, m_state->ssl_options().support)); + new_connection_ipv6.reset(new connection<t_protocol_handler>(io_context_, m_state, m_connection_type, m_state->ssl_options().support)); acceptor_ipv6.async_accept(new_connection_ipv6->socket(), - boost::bind(&boosted_tcp_server<t_protocol_handler>::handle_accept_ipv6, this, - boost::asio::placeholders::error)); + boost::bind(&boosted_tcp_server<t_protocol_handler>::handle_accept_ipv6, this, + boost::asio::placeholders::error)); } catch (const std::exception &e) { @@ -1353,7 +1359,7 @@ namespace net_utils { try { - io_service_.run(); + io_context_.run(); return true; } catch(const std::exception& ex) @@ -1411,7 +1417,7 @@ namespace net_utils while(!m_stop_signal_sent) { - // Create a pool of threads to run all of the io_services. + // Create a pool of threads to run all of the io_contexts. CRITICAL_REGION_BEGIN(m_threads_lock); for (std::size_t i = 0; i < threads_count; ++i) { @@ -1503,7 +1509,7 @@ namespace net_utils } connections_.clear(); connections_mutex.unlock(); - io_service_.stop(); + io_context_.stop(); CATCH_ENTRY_L0("boosted_tcp_server<t_protocol_handler>::send_stop_signal()", void()); } //--------------------------------------------------------------------------------- @@ -1550,7 +1556,7 @@ namespace net_utils (*current_new_connection)->setRpcStation(); // hopefully this is not needed actually } connection_ptr conn(std::move((*current_new_connection))); - (*current_new_connection).reset(new connection<t_protocol_handler>(io_service_, m_state, m_connection_type, conn->get_ssl_support())); + (*current_new_connection).reset(new connection<t_protocol_handler>(io_context_, m_state, m_connection_type, conn->get_ssl_support())); current_acceptor->async_accept((*current_new_connection)->socket(), boost::bind(accept_function_pointer, this, boost::asio::placeholders::error)); @@ -1585,7 +1591,7 @@ namespace net_utils assert(m_state != nullptr); // always set in constructor _erro("Some problems at accept: " << e.message() << ", connections_count = " << m_state->sock_count); misc_utils::sleep_no_w(100); - (*current_new_connection).reset(new connection<t_protocol_handler>(io_service_, m_state, m_connection_type, (*current_new_connection)->get_ssl_support())); + (*current_new_connection).reset(new connection<t_protocol_handler>(io_context_, m_state, m_connection_type, (*current_new_connection)->get_ssl_support())); current_acceptor->async_accept((*current_new_connection)->socket(), boost::bind(accept_function_pointer, this, boost::asio::placeholders::error)); @@ -1594,9 +1600,9 @@ namespace net_utils template<class t_protocol_handler> bool boosted_tcp_server<t_protocol_handler>::add_connection(t_connection_context& out, boost::asio::ip::tcp::socket&& sock, network_address real_remote, epee::net_utils::ssl_support_t ssl_support) { - if(std::addressof(get_io_service()) == std::addressof(GET_IO_SERVICE(sock))) + if(std::addressof(get_io_context()) == std::addressof(sock.get_executor().context())) { - connection_ptr conn(new connection<t_protocol_handler>(std::move(sock), m_state, m_connection_type, ssl_support)); + connection_ptr conn(new connection<t_protocol_handler>(io_context_, std::move(sock), m_state, m_connection_type, ssl_support)); if(conn->start(false, 1 < m_threads_count, std::move(real_remote))) { conn->get_context(out); @@ -1606,7 +1612,7 @@ namespace net_utils } else { - MWARNING(out << " was not added, socket/io_service mismatch"); + MWARNING(out << " was not added, socket/io_context mismatch"); } return false; } @@ -1619,7 +1625,7 @@ namespace net_utils sock_.open(remote_endpoint.protocol()); if(bind_ip != "0.0.0.0" && bind_ip != "0" && bind_ip != "" ) { - boost::asio::ip::tcp::endpoint local_endpoint(boost::asio::ip::address::from_string(bind_ip.c_str()), 0); + boost::asio::ip::tcp::endpoint local_endpoint(boost::asio::ip::make_address(bind_ip), 0); boost::system::error_code ec; sock_.bind(local_endpoint, ec); if (ec) @@ -1714,7 +1720,7 @@ namespace net_utils { TRY_ENTRY(); - connection_ptr new_connection_l(new connection<t_protocol_handler>(io_service_, m_state, m_connection_type, ssl_support) ); + connection_ptr new_connection_l(new connection<t_protocol_handler>(io_context_, m_state, m_connection_type, ssl_support) ); connections_mutex.lock(); connections_.insert(new_connection_l); MDEBUG("connections_ size now " << connections_.size()); @@ -1724,14 +1730,16 @@ namespace net_utils bool try_ipv6 = false; - boost::asio::ip::tcp::resolver resolver(io_service_); - boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(), adr, port, boost::asio::ip::tcp::resolver::query::canonical_name); + boost::asio::ip::tcp::resolver resolver(io_context_); + boost::asio::ip::tcp::resolver::results_type results{}; boost::system::error_code resolve_error; - boost::asio::ip::tcp::resolver::iterator iterator; + try { //resolving ipv4 address as ipv6 throws, catch here and move on - iterator = resolver.resolve(query, resolve_error); + results = resolver.resolve( + boost::asio::ip::tcp::v4(), adr, port, boost::asio::ip::tcp::resolver::canonical_name, resolve_error + ); } catch (const boost::system::system_error& e) { @@ -1749,8 +1757,7 @@ namespace net_utils std::string bind_ip_to_use; - boost::asio::ip::tcp::resolver::iterator end; - if(iterator == end) + if(results.empty()) { if (!m_use_ipv6) { @@ -1770,11 +1777,11 @@ namespace net_utils if (try_ipv6) { - boost::asio::ip::tcp::resolver::query query6(boost::asio::ip::tcp::v6(), adr, port, boost::asio::ip::tcp::resolver::query::canonical_name); - - iterator = resolver.resolve(query6, resolve_error); + results = resolver.resolve( + boost::asio::ip::tcp::v6(), adr, port, boost::asio::ip::tcp::resolver::canonical_name, resolve_error + ); - if(iterator == end) + if(results.empty()) { _erro("Failed to resolve " << adr); return false; @@ -1794,6 +1801,8 @@ namespace net_utils } + const auto iterator = results.begin(); + MDEBUG("Trying to connect to " << adr << ":" << port << ", bind_ip = " << bind_ip_to_use); //boost::asio::ip::tcp::endpoint remote_endpoint(boost::asio::ip::address::from_string(addr.c_str()), port); @@ -1820,7 +1829,6 @@ namespace net_utils if (r) { new_connection_l->get_context(conn_context); - //new_connection_l.reset(new connection<t_protocol_handler>(io_service_, m_config, m_sock_count, m_pfilter)); } else { @@ -1839,7 +1847,7 @@ namespace net_utils bool boosted_tcp_server<t_protocol_handler>::connect_async(const std::string& adr, const std::string& port, uint32_t conn_timeout, const t_callback &cb, const std::string& bind_ip, epee::net_utils::ssl_support_t ssl_support) { TRY_ENTRY(); - connection_ptr new_connection_l(new connection<t_protocol_handler>(io_service_, m_state, m_connection_type, ssl_support) ); + connection_ptr new_connection_l(new connection<t_protocol_handler>(io_context_, m_state, m_connection_type, ssl_support) ); connections_mutex.lock(); connections_.insert(new_connection_l); MDEBUG("connections_ size now " << connections_.size()); @@ -1849,14 +1857,16 @@ namespace net_utils bool try_ipv6 = false; - boost::asio::ip::tcp::resolver resolver(io_service_); - boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(), adr, port, boost::asio::ip::tcp::resolver::query::canonical_name); + boost::asio::ip::tcp::resolver resolver(io_context_); + boost::asio::ip::tcp::resolver::results_type results{}; boost::system::error_code resolve_error; - boost::asio::ip::tcp::resolver::iterator iterator; + try { //resolving ipv4 address as ipv6 throws, catch here and move on - iterator = resolver.resolve(query, resolve_error); + results = resolver.resolve( + boost::asio::ip::tcp::v4(), adr, port, boost::asio::ip::tcp::resolver::canonical_name, resolve_error + ); } catch (const boost::system::system_error& e) { @@ -1872,8 +1882,7 @@ namespace net_utils throw; } - boost::asio::ip::tcp::resolver::iterator end; - if(iterator == end) + if(results.empty()) { if (!try_ipv6) { @@ -1888,24 +1897,23 @@ namespace net_utils if (try_ipv6) { - boost::asio::ip::tcp::resolver::query query6(boost::asio::ip::tcp::v6(), adr, port, boost::asio::ip::tcp::resolver::query::canonical_name); - - iterator = resolver.resolve(query6, resolve_error); + results = resolver.resolve( + boost::asio::ip::tcp::v6(), adr, port, boost::asio::ip::tcp::resolver::canonical_name, resolve_error + ); - if(iterator == end) + if(results.empty()) { _erro("Failed to resolve " << adr); return false; } } - - boost::asio::ip::tcp::endpoint remote_endpoint(*iterator); + boost::asio::ip::tcp::endpoint remote_endpoint(*results.begin()); sock_.open(remote_endpoint.protocol()); if(bind_ip != "0.0.0.0" && bind_ip != "0" && bind_ip != "" ) { - boost::asio::ip::tcp::endpoint local_endpoint(boost::asio::ip::address::from_string(bind_ip.c_str()), 0); + boost::asio::ip::tcp::endpoint local_endpoint(boost::asio::ip::make_address(bind_ip.c_str()), 0); boost::system::error_code ec; sock_.bind(local_endpoint, ec); if (ec) @@ -1917,7 +1925,7 @@ namespace net_utils } } - boost::shared_ptr<boost::asio::deadline_timer> sh_deadline(new boost::asio::deadline_timer(io_service_)); + boost::shared_ptr<boost::asio::deadline_timer> sh_deadline(new boost::asio::deadline_timer(io_context_)); //start deadline sh_deadline->expires_from_now(boost::posix_time::milliseconds(conn_timeout)); sh_deadline->async_wait([=](const boost::system::error_code& error) diff --git a/contrib/epee/include/net/connection_basic.hpp b/contrib/epee/include/net/connection_basic.hpp index a26d538cd..8291d137b 100644 --- a/contrib/epee/include/net/connection_basic.hpp +++ b/contrib/epee/include/net/connection_basic.hpp @@ -112,21 +112,20 @@ class connection_basic { // not-templated base class for rapid developmet of som std::deque<byte_slice> m_send_que; volatile bool m_is_multithreaded; /// Strand to ensure the connection's handlers are not called concurrently. - boost::asio::io_service::strand strand_; + boost::asio::io_context::strand strand_; /// Socket for the connection. boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_; ssl_support_t m_ssl_support; public: // first counter is the ++/-- count of current sockets, the other socket_number is only-increasing ++ number generator - connection_basic(boost::asio::ip::tcp::socket&& socket, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support); - connection_basic(boost::asio::io_service &io_service, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support); + 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); + connection_basic(boost::asio::io_context &context, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support); virtual ~connection_basic() noexcept(false); //! \return `shared_state` object passed in construction (ptr never changes). connection_basic_shared_state& get_state() noexcept { return *m_state; /* verified in constructor */ } - connection_basic(boost::asio::io_service& io_service, std::atomic<long> &ref_sock_count, std::atomic<long> &sock_number, ssl_support_t ssl); boost::asio::ip::tcp::socket& socket() { return socket_.next_layer(); } ssl_support_t get_ssl_support() const { return m_ssl_support; } @@ -135,7 +134,7 @@ class connection_basic { // not-templated base class for rapid developmet of som bool handshake(boost::asio::ssl::stream_base::handshake_type type, boost::asio::const_buffer buffer = {}) { //m_state != nullptr verified in constructor - return m_state->ssl_options().handshake(socket_, type, buffer); + return m_state->ssl_options().handshake(strand_.context(), socket_, type, buffer); } template<typename MutableBufferSequence, typename ReadHandler> diff --git a/contrib/epee/include/net/http_server_impl_base.h b/contrib/epee/include/net/http_server_impl_base.h index 7c7b8add2..e24391674 100644 --- a/contrib/epee/include/net/http_server_impl_base.h +++ b/contrib/epee/include/net/http_server_impl_base.h @@ -54,7 +54,7 @@ namespace epee : m_net_server(epee::net_utils::e_connection_type_RPC) {} - explicit http_server_impl_base(boost::asio::io_service& external_io_service) + explicit http_server_impl_base(boost::asio::io_context& external_io_service) : m_net_server(external_io_service) {} diff --git a/contrib/epee/include/net/levin_protocol_handler_async.h b/contrib/epee/include/net/levin_protocol_handler_async.h index bd6ffe930..86cee9a11 100644 --- a/contrib/epee/include/net/levin_protocol_handler_async.h +++ b/contrib/epee/include/net/levin_protocol_handler_async.h @@ -200,7 +200,7 @@ public: struct anvoke_handler: invoke_response_handler_base { anvoke_handler(const callback_t& cb, uint64_t timeout, async_protocol_handler& con, int command) - :m_cb(cb), m_timeout(timeout), m_con(con), m_timer(con.m_pservice_endpoint->get_io_service()), m_timer_started(false), + :m_cb(cb), m_timeout(timeout), m_con(con), m_timer(con.m_pservice_endpoint->get_io_context()), m_timer_started(false), m_cancel_timer_called(false), m_timer_cancelled(false), m_command(command) { if(m_con.start_outer_call()) diff --git a/contrib/epee/include/net/net_helper.h b/contrib/epee/include/net/net_helper.h index 0a35797fd..6728daa0e 100644 --- a/contrib/epee/include/net/net_helper.h +++ b/contrib/epee/include/net/net_helper.h @@ -34,7 +34,7 @@ #include <atomic> #include <string> #include <boost/version.hpp> -#include <boost/asio/io_service.hpp> +#include <boost/asio/io_context.hpp> #include <boost/asio/ip/tcp.hpp> #include <boost/asio/read.hpp> #include <boost/asio/ssl.hpp> @@ -158,11 +158,11 @@ namespace net_utils inline try_connect_result_t try_connect(const std::string& addr, const std::string& port, std::chrono::milliseconds timeout) { - m_deadline.expires_from_now(timeout); + m_deadline.expires_after(timeout); boost::unique_future<boost::asio::ip::tcp::socket> connection = m_connector(addr, port, m_deadline); for (;;) { - m_io_service.reset(); + m_io_service.restart(); m_io_service.run_one(); if (connection.is_ready()) @@ -178,7 +178,7 @@ namespace net_utils // SSL Options if (m_ssl_options.support == epee::net_utils::ssl_support_t::e_ssl_support_enabled || m_ssl_options.support == epee::net_utils::ssl_support_t::e_ssl_support_autodetect) { - if (!m_ssl_options.handshake(*m_ssl_socket, boost::asio::ssl::stream_base::client, {}, addr, timeout)) + if (!m_ssl_options.handshake(m_io_service, *m_ssl_socket, boost::asio::ssl::stream_base::client, {}, addr, timeout)) { if (m_ssl_options.support == epee::net_utils::ssl_support_t::e_ssl_support_autodetect) { @@ -285,7 +285,7 @@ namespace net_utils try { - m_deadline.expires_from_now(timeout); + m_deadline.expires_after(timeout); // Set up the variable that receives the result of the asynchronous // operation. The error code is set to would_block to signal that the @@ -303,7 +303,7 @@ namespace net_utils // Block until the asynchronous operation has completed. while (ec == boost::asio::error::would_block) { - m_io_service.reset(); + m_io_service.restart(); m_io_service.run_one(); } @@ -409,7 +409,7 @@ namespace net_utils // Set a deadline for the asynchronous operation. Since this function uses // a composed operation (async_read_until), the deadline applies to the // entire operation, rather than individual reads from the socket. - m_deadline.expires_from_now(timeout); + m_deadline.expires_after(timeout); // Set up the variable that receives the result of the asynchronous // operation. The error code is set to would_block to signal that the @@ -436,7 +436,7 @@ namespace net_utils // Block until the asynchronous operation has completed. while (ec == boost::asio::error::would_block && !m_shutdowned) { - m_io_service.reset(); + m_io_service.restart(); m_io_service.run_one(); } @@ -495,7 +495,7 @@ namespace net_utils // Set a deadline for the asynchronous operation. Since this function uses // a composed operation (async_read_until), the deadline applies to the // entire operation, rather than individual reads from the socket. - m_deadline.expires_from_now(timeout); + m_deadline.expires_after(timeout); // Set up the variable that receives the result of the asynchronous // operation. The error code is set to would_block to signal that the @@ -580,7 +580,7 @@ namespace net_utils return true; } - boost::asio::io_service& get_io_service() + boost::asio::io_context& get_io_service() { return m_io_service; } @@ -607,7 +607,7 @@ namespace net_utils // Check whether the deadline has passed. We compare the deadline against // the current time since a new asynchronous operation may have moved the // deadline before this actor had a chance to run. - if (m_deadline.expires_at() <= std::chrono::steady_clock::now()) + if (m_deadline.expiry() <= std::chrono::steady_clock::now()) { // The deadline has passed. The socket is closed so that any outstanding // asynchronous operations are cancelled. This allows the blocked @@ -628,11 +628,11 @@ namespace net_utils void shutdown_ssl() { // ssl socket shutdown blocks if server doesn't respond. We close after 2 secs boost::system::error_code ec = boost::asio::error::would_block; - m_deadline.expires_from_now(std::chrono::milliseconds(2000)); + m_deadline.expires_after(std::chrono::milliseconds(2000)); m_ssl_socket->async_shutdown(boost::lambda::var(ec) = boost::lambda::_1); while (ec == boost::asio::error::would_block) { - m_io_service.reset(); + m_io_service.restart(); m_io_service.run_one(); } // Ignore "short read" error @@ -676,7 +676,7 @@ namespace net_utils } protected: - boost::asio::io_service m_io_service; + boost::asio::io_context m_io_service; boost::asio::ssl::context m_ctx; std::shared_ptr<boost::asio::ssl::stream<boost::asio::ip::tcp::socket>> m_ssl_socket; std::function<connect_func> m_connector; @@ -688,119 +688,6 @@ namespace net_utils std::atomic<uint64_t> m_bytes_sent; std::atomic<uint64_t> m_bytes_received; }; - - - /************************************************************************/ - /* */ - /************************************************************************/ - class async_blocked_mode_client: public blocked_mode_client - { - public: - async_blocked_mode_client():m_send_deadline(blocked_mode_client::m_io_service) - { - - // No deadline is required until the first socket operation is started. We - // set the deadline to positive infinity so that the actor takes no action - // until a specific deadline is set. - m_send_deadline.expires_at(boost::posix_time::pos_infin); - - // Start the persistent actor that checks for deadline expiry. - check_send_deadline(); - } - ~async_blocked_mode_client() - { - m_send_deadline.cancel(); - } - - bool shutdown() - { - blocked_mode_client::shutdown(); - m_send_deadline.cancel(); - return true; - } - - inline - bool send(const void* data, size_t sz) - { - try - { - /* - m_send_deadline.expires_from_now(boost::posix_time::milliseconds(m_reciev_timeout)); - - // Set up the variable that receives the result of the asynchronous - // operation. The error code is set to would_block to signal that the - // operation is incomplete. Asio guarantees that its asynchronous - // operations will never fail with would_block, so any other value in - // ec indicates completion. - boost::system::error_code ec = boost::asio::error::would_block; - - // Start the asynchronous operation itself. The boost::lambda function - // object is used as a callback and will update the ec variable when the - // operation completes. The blocking_udp_client.cpp example shows how you - // can use boost::bind rather than boost::lambda. - boost::asio::async_write(m_socket, boost::asio::buffer(data, sz), boost::lambda::var(ec) = boost::lambda::_1); - - // Block until the asynchronous operation has completed. - while(ec == boost::asio::error::would_block) - { - m_io_service.run_one(); - }*/ - - boost::system::error_code ec; - - size_t writen = write(data, sz, ec); - - if (!writen || ec) - { - LOG_PRINT_L3("Problems at write: " << ec.message()); - return false; - }else - { - m_send_deadline.expires_at(boost::posix_time::pos_infin); - } - } - - catch(const boost::system::system_error& er) - { - LOG_ERROR("Some problems at connect, message: " << er.what()); - return false; - } - catch(...) - { - LOG_ERROR("Some fatal problems."); - return false; - } - - return true; - } - - - private: - - boost::asio::deadline_timer m_send_deadline; - - void check_send_deadline() - { - // Check whether the deadline has passed. We compare the deadline against - // the current time since a new asynchronous operation may have moved the - // deadline before this actor had a chance to run. - if (m_send_deadline.expires_at() <= boost::asio::deadline_timer::traits_type::now()) - { - // The deadline has passed. The socket is closed so that any outstanding - // asynchronous operations are cancelled. This allows the blocked - // connect(), read_line() or write_line() functions to return. - LOG_PRINT_L3("Timed out socket"); - m_ssl_socket->next_layer().close(); - - // There is no longer an active deadline. The expiry is set to positive - // infinity so that the actor takes no action until a new deadline is set. - m_send_deadline.expires_at(boost::posix_time::pos_infin); - } - - // Put the actor back to sleep. - m_send_deadline.async_wait(boost::bind(&async_blocked_mode_client::check_send_deadline, this)); - } - }; } } diff --git a/contrib/epee/include/net/net_ssl.h b/contrib/epee/include/net/net_ssl.h index c79a3acc1..f6376c72c 100644 --- a/contrib/epee/include/net/net_ssl.h +++ b/contrib/epee/include/net/net_ssl.h @@ -34,6 +34,7 @@ #include <string> #include <vector> #include <boost/utility/string_ref.hpp> +#include <boost/asio/io_context.hpp> #include <boost/asio/ip/tcp.hpp> #include <boost/asio/ssl.hpp> #include <boost/filesystem/path.hpp> @@ -125,6 +126,7 @@ namespace net_utils \note It is strongly encouraged that clients using `system_ca` verification provide a non-empty `host` for rfc2818 verification. + \param io_context associated with `socket`. \param socket Used in SSL handshake and verification \param type Client or server \param host This parameter is only used when @@ -136,6 +138,7 @@ namespace net_utils \return True if the SSL handshake completes with peer verification settings. */ bool handshake( + boost::asio::io_context& io_context, boost::asio::ssl::stream<boost::asio::ip::tcp::socket> &socket, boost::asio::ssl::stream_base::handshake_type type, boost::asio::const_buffer buffer = {}, diff --git a/contrib/epee/include/net/net_utils_base.h b/contrib/epee/include/net/net_utils_base.h index 722206ee1..2cf6e795d 100644 --- a/contrib/epee/include/net/net_utils_base.h +++ b/contrib/epee/include/net/net_utils_base.h @@ -30,7 +30,7 @@ #define _NET_UTILS_BASE_H_ #include <boost/uuid/uuid.hpp> -#include <boost/asio/io_service.hpp> +#include <boost/asio/io_context.hpp> #include <boost/asio/ip/address_v6.hpp> #include <typeinfo> #include <type_traits> @@ -47,10 +47,12 @@ #define MAKE_IP( a1, a2, a3, a4 ) (a1|(a2<<8)|(a3<<16)|(((uint32_t)a4)<<24)) #endif +/* Use the below function carefully. The executor and io_context are slightly + different concepts. */ #if BOOST_VERSION >= 107000 -#define GET_IO_SERVICE(s) ((boost::asio::io_context&)(s).get_executor().context()) + #define MONERO_GET_EXECUTOR(type) type . get_executor() #else -#define GET_IO_SERVICE(s) ((s).get_io_service()) + #define MONERO_GET_EXECUTOR(type) type . get_io_context() #endif namespace net @@ -443,7 +445,7 @@ namespace net_utils virtual bool send_done()=0; virtual bool call_run_once_service_io()=0; virtual bool request_callback()=0; - virtual boost::asio::io_service& get_io_service()=0; + virtual boost::asio::io_context& get_io_context()=0; //protect from deletion connection object(with protocol instance) during external call "invoke" virtual bool add_ref()=0; virtual bool release()=0; diff --git a/contrib/epee/src/connection_basic.cpp b/contrib/epee/src/connection_basic.cpp index b0a30f47f..1fdd82c1b 100644 --- a/contrib/epee/src/connection_basic.cpp +++ b/contrib/epee/src/connection_basic.cpp @@ -46,12 +46,6 @@ // TODO: #include "net/network_throttle-detail.hpp" -#if BOOST_VERSION >= 107000 -#define GET_IO_SERVICE(s) ((boost::asio::io_context&)(s).get_executor().context()) -#else -#define GET_IO_SERVICE(s) ((s).get_io_service()) -#endif - #undef MONERO_DEFAULT_LOG_CATEGORY #define MONERO_DEFAULT_LOG_CATEGORY "net.conn" @@ -127,12 +121,12 @@ connection_basic_pimpl::connection_basic_pimpl(const std::string &name) : m_thro int connection_basic_pimpl::m_default_tos; // methods: -connection_basic::connection_basic(boost::asio::ip::tcp::socket&& sock, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support) +connection_basic::connection_basic(boost::asio::io_context &io_context, boost::asio::ip::tcp::socket&& sock, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support) : m_state(std::move(state)), mI( new connection_basic_pimpl("peer") ), - strand_(GET_IO_SERVICE(sock)), - socket_(GET_IO_SERVICE(sock), get_context(m_state.get())), + strand_(io_context), + socket_(io_context, get_context(m_state.get())), m_want_close_connection(false), m_was_shutdown(false), m_is_multithreaded(false), @@ -152,12 +146,12 @@ connection_basic::connection_basic(boost::asio::ip::tcp::socket&& sock, std::sha _note("Spawned connection #"<<mI->m_peer_number<<" to " << remote_addr_str << " currently we have sockets count:" << m_state->sock_count); } -connection_basic::connection_basic(boost::asio::io_service &io_service, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support) +connection_basic::connection_basic(boost::asio::io_context &io_context, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support) : m_state(std::move(state)), mI( new connection_basic_pimpl("peer") ), - strand_(io_service), - socket_(io_service, get_context(m_state.get())), + strand_(io_context), + socket_(io_context, get_context(m_state.get())), m_want_close_connection(false), m_was_shutdown(false), m_is_multithreaded(false), diff --git a/contrib/epee/src/net_helper.cpp b/contrib/epee/src/net_helper.cpp index 719f1c8e0..de0f1211b 100644 --- a/contrib/epee/src/net_helper.cpp +++ b/contrib/epee/src/net_helper.cpp @@ -4,22 +4,38 @@ namespace epee { namespace net_utils { + namespace + { + struct new_connection + { + boost::promise<boost::asio::ip::tcp::socket> result_; + boost::asio::ip::tcp::socket socket_; + + template<typename T> + explicit new_connection(T&& executor) + : result_(), socket_(std::forward<T>(executor)) + {} + }; + } + boost::unique_future<boost::asio::ip::tcp::socket> direct_connect::operator()(const std::string& addr, const std::string& port, boost::asio::steady_timer& timeout) const { // Get a list of endpoints corresponding to the server name. ////////////////////////////////////////////////////////////////////////// - boost::asio::ip::tcp::resolver resolver(GET_IO_SERVICE(timeout)); - boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(), addr, port, boost::asio::ip::tcp::resolver::query::canonical_name); + boost::asio::ip::tcp::resolver resolver(MONERO_GET_EXECUTOR(timeout)); bool try_ipv6 = false; - boost::asio::ip::tcp::resolver::iterator iterator; - boost::asio::ip::tcp::resolver::iterator end; + boost::asio::ip::tcp::resolver::results_type results{}; boost::system::error_code resolve_error; + try { - iterator = resolver.resolve(query, resolve_error); - if(iterator == end) // Documentation states that successful call is guaranteed to be non-empty + results = resolver.resolve( + boost::asio::ip::tcp::v4(), addr, port, boost::asio::ip::tcp::resolver::canonical_name, resolve_error + ); + + if (results.empty()) { // if IPv4 resolution fails, try IPv6. Unintentional outgoing IPv6 connections should only // be possible if for some reason a hostname was given and that hostname fails IPv4 resolution, @@ -37,27 +53,20 @@ namespace net_utils } try_ipv6 = true; } + if (try_ipv6) { - boost::asio::ip::tcp::resolver::query query6(boost::asio::ip::tcp::v6(), addr, port, boost::asio::ip::tcp::resolver::query::canonical_name); - iterator = resolver.resolve(query6); - if (iterator == end) + results = resolver.resolve( + boost::asio::ip::tcp::v6(), addr, port, boost::asio::ip::tcp::resolver::canonical_name + ); + if (results.empty()) throw boost::system::system_error{boost::asio::error::fault, "Failed to resolve " + addr}; } ////////////////////////////////////////////////////////////////////////// - struct new_connection - { - boost::promise<boost::asio::ip::tcp::socket> result_; - boost::asio::ip::tcp::socket socket_; - - explicit new_connection(boost::asio::io_service& io_service) - : result_(), socket_(io_service) - {} - }; - const auto shared = std::make_shared<new_connection>(GET_IO_SERVICE(timeout)); + const auto shared = std::make_shared<new_connection>(MONERO_GET_EXECUTOR(timeout)); timeout.async_wait([shared] (boost::system::error_code error) { if (error != boost::system::errc::operation_canceled && shared && shared->socket_.is_open()) @@ -66,7 +75,7 @@ namespace net_utils shared->socket_.close(); } }); - shared->socket_.async_connect(*iterator, [shared] (boost::system::error_code error) + shared->socket_.async_connect(*results.begin(), [shared] (boost::system::error_code error) { if (shared) { diff --git a/contrib/epee/src/net_ssl.cpp b/contrib/epee/src/net_ssl.cpp index 9200796a8..aef37844e 100644 --- a/contrib/epee/src/net_ssl.cpp +++ b/contrib/epee/src/net_ssl.cpp @@ -29,6 +29,7 @@ #include <string.h> #include <thread> +#include <boost/asio/post.hpp> #include <boost/asio/ssl.hpp> #include <boost/cerrno.hpp> #include <boost/filesystem/operations.hpp> @@ -45,6 +46,13 @@ #undef MONERO_DEFAULT_LOG_CATEGORY #define MONERO_DEFAULT_LOG_CATEGORY "net.ssl" + +#if BOOST_VERSION >= 107300 + #define MONERO_HOSTNAME_VERIFY boost::asio::ssl::host_name_verification +#else + #define MONERO_HOSTNAME_VERIFY boost::asio::ssl::rfc2818_verification +#endif + // openssl genrsa -out /tmp/KEY 4096 // openssl req -new -key /tmp/KEY -out /tmp/REQ // openssl x509 -req -days 999999 -sha256 -in /tmp/REQ -signkey /tmp/KEY -out /tmp/CERT @@ -526,7 +534,7 @@ void ssl_options_t::configure( // preverified means it passed system or user CA check. System CA is never loaded // when fingerprints are whitelisted. const bool verified = preverified && - (verification != ssl_verification_t::system_ca || host.empty() || boost::asio::ssl::rfc2818_verification(host)(preverified, ctx)); + (verification != ssl_verification_t::system_ca || host.empty() || MONERO_HOSTNAME_VERIFY(host)(preverified, ctx)); if (!verified && !has_fingerprint(ctx)) { @@ -544,6 +552,7 @@ void ssl_options_t::configure( } bool ssl_options_t::handshake( + boost::asio::io_context& io_context, boost::asio::ssl::stream<boost::asio::ip::tcp::socket> &socket, boost::asio::ssl::stream_base::handshake_type type, boost::asio::const_buffer buffer, @@ -555,12 +564,11 @@ bool ssl_options_t::handshake( auto start_handshake = [&]{ using ec_t = boost::system::error_code; using timer_t = boost::asio::steady_timer; - using strand_t = boost::asio::io_service::strand; + using strand_t = boost::asio::io_context::strand; using socket_t = boost::asio::ip::tcp::socket; - auto &io_context = GET_IO_SERVICE(socket); if (io_context.stopped()) - io_context.reset(); + io_context.restart(); strand_t strand(io_context); timer_t deadline(io_context, timeout); @@ -595,13 +603,13 @@ bool ssl_options_t::handshake( state.result = ec; if (!state.cancel_handshake) { state.cancel_timer = true; - ec_t ec; - deadline.cancel(ec); + deadline.cancel(); } }; deadline.async_wait(on_timer); - strand.post( + boost::asio::post( + strand, [&]{ socket.async_handshake( type, |
