diff options
author | luigi1111 <luigi1111w@gmail.com> | 2019-08-14 15:21:47 -0500 |
---|---|---|
committer | luigi1111 <luigi1111w@gmail.com> | 2019-08-14 15:21:47 -0500 |
commit | e37e263fcdfa71790e9375fb9f885dca5bd1d470 (patch) | |
tree | 81d634746b0683330cb9beb08053a1b3a73ca160 /contrib/epee/src/net_helper.cpp | |
parent | Merge pull request #5779 (diff) | |
parent | Add IPv6 support (diff) | |
download | monero-e37e263fcdfa71790e9375fb9f885dca5bd1d470.tar.xz |
Merge pull request #4851
155475d Add IPv6 support (KeeJef/tewinget)
Diffstat (limited to 'contrib/epee/src/net_helper.cpp')
-rw-r--r-- | contrib/epee/src/net_helper.cpp | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/contrib/epee/src/net_helper.cpp b/contrib/epee/src/net_helper.cpp index 3543f5716..719f1c8e0 100644 --- a/contrib/epee/src/net_helper.cpp +++ b/contrib/epee/src/net_helper.cpp @@ -11,10 +11,39 @@ namespace net_utils ////////////////////////////////////////////////////////////////////////// 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::iterator iterator = resolver.resolve(query); + + bool try_ipv6 = false; + boost::asio::ip::tcp::resolver::iterator iterator; boost::asio::ip::tcp::resolver::iterator end; - if(iterator == end) // Documentation states that successful call is guaranteed to be non-empty - throw boost::system::system_error{boost::asio::error::fault, "Failed to resolve " + addr}; + 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 + { + // 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, + // so at least for now there should not be a need for a flag "using ipv6 is ok" + try_ipv6 = true; + } + + } + catch (const boost::system::system_error& e) + { + if (resolve_error != boost::asio::error::host_not_found && + resolve_error != boost::asio::error::host_not_found_try_again) + { + throw; + } + 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) + throw boost::system::system_error{boost::asio::error::fault, "Failed to resolve " + addr}; + } ////////////////////////////////////////////////////////////////////////// |