Objects of type basic_resolver<InternetProtocol> are used to perform name resolution. Name resolution is the translation of a host name and service name into a sequence of endpoints, or the translation of an endpoint into its corresponding host name and service name.
namespace std { namespace experimental { namespace net { inline namespace v1 { namespace ip { template<class InternetProtocol> class basic_resolver : public resolver_base { public: // types: using executor_type = io_context::executor_type; using protocol_type = InternetProtocol; using endpoint_type = typename InternetProtocol::endpoint; using results_type = basic_resolver_results<InternetProtocol>; // [internet.resolver.cons], construct / copy / destroy: explicit basic_resolver(io_context& ctx); basic_resolver(const basic_resolver&) = delete; basic_resolver(basic_resolver&& rhs) noexcept; ~basic_resolver(); basic_resolver& operator=(const basic_resolver&) = delete; basic_resolver& operator=(basic_resolver&& rhs); // [internet.resolver.ops], basic_resolver operations: executor_type get_executor() noexcept; void cancel(); results_type resolve(string_view host_name, string_view service_name); results_type resolve(string_view host_name, string_view service_name, error_code& ec); results_type resolve(string_view host_name, string_view service_name, flags f); results_type resolve(string_view host_name, string_view service_name, flags f, error_code& ec); template<class CompletionToken> DEDUCED async_resolve(string_view host_name, string_view service_name, CompletionToken&& token); template<class CompletionToken> DEDUCED async_resolve(string_view host_name, string_view service_name, flags f, CompletionToken&& token); results_type resolve(const protocol_type& protocol, string_view host_name, string_view service_name); results_type resolve(const protocol_type& protocol, string_view host_name, string_view service_name, error_code& ec); results_type resolve(const protocol_type& protocol, string_view host_name, string_view service_name, flags f); results_type resolve(const protocol_type& protocol, string_view host_name, string_view service_name, flags f, error_code& ec); template<class CompletionToken> DEDUCED async_resolve(const protocol_type& protocol, string_view host_name, string_view service_name, CompletionToken&& token); template<class CompletionToken> DEDUCED async_resolve(const protocol_type& protocol, string_view host_name, string_view service_name, flags f, CompletionToken&& token); results_type resolve(const endpoint_type& e); results_type resolve(const endpoint_type& e, error_code& ec); template<class CompletionToken> DEDUCED async_resolve(const endpoint_type& e, CompletionToken&& token); }; } // namespace ip } // inline namespace v1 } // namespace net } // namespace experimental } // namespace std
explicit basic_resolver(io_context& ctx);
Postconditions: get_executor() == ctx.get_executor().
basic_resolver(basic_resolver&& rhs) noexcept;
Effects: Move constructs an object of class basic_resolver<InternetProtocol> that refers to the state originally represented by rhs.
Postconditions: get_executor() == rhs.get_executor().
~basic_resolver();
Effects: Destroys the resolver, canceling all asynchronous operations associated with this resolver as if by calling cancel().
basic_resolver& operator=(basic_resolver&& rhs);
Effects: Cancels all outstanding asynchronous operations associated with *this as if by calling cancel(), then moves into *this the state originally represented by rhs.
Postconditions: get_executor() == rhs.get_executor().
Returns: *this.
executor_type get_executor() noexcept;
Returns: The associated executor.
void cancel();
Effects: Cancels all outstanding asynchronous resolve operations associated with *this. Completion handlers for canceled operations are passed an error code ec such that ec == errc::operation_canceled yields true.
Remarks: Does not block (C++ 2014 [defns.block]) the calling thread pending completion of the canceled operations.
results_type resolve(string_view host_name, string_view service_name);
results_type resolve(string_view host_name, string_view service_name,
error_code& ec);
Returns: resolve(host_name, service_name, resolver_base::flags(), ec).
results_type resolve(string_view host_name, string_view service_name,
flags f);
results_type resolve(string_view host_name, string_view service_name,
flags f, error_code& ec);
Effects: If host_name.data() != nullptr, let H be an ntbs constructed from host_name; otherwise, let H be nullptr. If service_name.data() != nullptr, let S be an ntbs constructed from service_name; otherwise, let S be nullptr. Resolves a host name and service name, as if by POSIX:
addrinfo hints; hints.ai_flags = static_cast<int>(f); hints.ai_family = AF_UNSPEC; hints.ai_socktype = endpoint_type().protocol().type(); hints.ai_protocol = endpoint_type().protocol().protocol(); hints.ai_addr = nullptr; hints.ai_addrlen = 0; hints.ai_canonname = nullptr; hints.ai_next = nullptr; addrinfo* result = nullptr; getaddrinfo(H, S, &hints, &result);
Returns: On success, a non-empty results object containing the results of the resolve operation. Otherwise results_type().
template<class CompletionToken>
DEDUCED async_resolve(string_view host_name, string_view service_name,
CompletionToken&& token);
Returns:
async_resolve(host_name, service_name, resolver_base::flags(), forward<CompletionToken>(token))
template<class CompletionToken>
DEDUCED async_resolve(string_view host_name, string_view service_name,
flags f, CompletionToken&& token);
Completion signature: void(error_code ec, results_type r).
Effects: If host_name.data() != nullptr, let H be an ntbs constructed from host_name; otherwise, let H be nullptr. If service_name.data() != nullptr, let S be an ntbs constructed from service_name; otherwise, let S be nullptr. Initiates an asynchronous operation to resolve a host name and service name, as if by POSIX:
addrinfo hints; hints.ai_flags = static_cast<int>(f); hints.ai_family = AF_UNSPEC; hints.ai_socktype = endpoint_type().protocol().type(); hints.ai_protocol = endpoint_type().protocol().protocol(); hints.ai_addr = nullptr; hints.ai_addrlen = 0; hints.ai_canonname = nullptr; hints.ai_next = nullptr; addrinfo* result = nullptr; getaddrinfo(H, S, &hints, &result);
On success, r is a non-empty results object containing the results of the resolve operation. Otherwise, r is results_type().
results_type resolve(const protocol_type& protocol,
string_view host_name, string_view service_name);
results_type resolve(const protocol_type& protocol,
string_view host_name, string_view service_name,
error_code& ec);
Returns: resolve(protocol, host_name, service_name, resolver_base::flags(), ec).
results_type resolve(const protocol_type& protocol,
string_view host_name, string_view service_name,
flags f);
results_type resolve(const protocol_type& protocol,
string_view host_name, string_view service_name,
flags f, error_code& ec);
Effects: If host_name.data() != nullptr, let H be an ntbs constructed from host_name; otherwise, let H be nullptr. If service_name.data() != nullptr, let S be an ntbs constructed from service_name; otherwise, let S be nullptr. Resolves a host name and service name, as if by POSIX:
addrinfo hints; hints.ai_flags = static_cast<int>(f); hints.ai_family = protocol.family(); hints.ai_socktype = protocol.type(); hints.ai_protocol = protocol.protocol(); hints.ai_addr = nullptr; hints.ai_addrlen = 0; hints.ai_canonname = nullptr; hints.ai_next = nullptr; addrinfo* result = nullptr; getaddrinfo(H, S, &hints, &result);
Returns: On success, a non-empty results object containing the results of the resolve operation. Otherwise results_type().
template<class CompletionToken>
DEDUCED async_resolve(const protocol_type& protocol,
string_view host_name, string_view service_name,
CompletionToken&& token);
Returns:
async_resolve(protocol, host_name, service_name, resolver_base::flags(), forward<CompletionToken>(token))
template<class CompletionToken>
DEDUCED async_resolve(const protocol& protocol,
string_view host_name, string_view service_name,
flags f, CompletionToken&& token);
Completion signature: void(error_code ec, results_type r).
Effects: If host_name.data() != nullptr, let H be an ntbs constructed from host_name; otherwise, let H be nullptr. If service_name.data() != nullptr, let S be an ntbs constructed from service_name; otherwise, let S be nullptr. Initiates an asynchronous operation to resolve a host name and service name, as if by POSIX:
addrinfo hints; hints.ai_flags = static_cast<int>(f); hints.ai_family = protocol.family(); hints.ai_socktype = protocol.type(); hints.ai_protocol = protocol.protocol(); hints.ai_addr = nullptr; hints.ai_addrlen = 0; hints.ai_canonname = nullptr; hints.ai_next = nullptr; addrinfo* result = nullptr; getaddrinfo(H, S, &hints, &result);
On success, r is a non-empty results object containing the results of the resolve operation. Otherwise, r is results_type().
results_type resolve(const endpoint_type& e);
results_type resolve(const endpoint_type& e, error_code& ec);
Effects: Let S1 and S2 be implementation-defined values that are sufficiently large to hold the host name and service name respectively. Resolves an endpoint as if by POSIX:
char host_name[S1]; char service_name[S2]; int flags = 0; if (endpoint_type().protocol().type() == SOCK_DGRAM) flags |= NI_DGRAM; int result = getnameinfo((const sockaddr*)e.data(), e.size(), host_name, S1, service_name, S2, flags); if (result != 0){ flags |= NI_NUMERICSERV; result = getnameinfo((const sockaddr*)e.data(), e.size(), host_name, S1, service_name, S2, flags); }
Returns: On success, a results object with size() == 1 containing the results of the resolve operation. Otherwise results_type().
template<class CompletionToken>
DEDUCED async_resolve(const endpoint_type& e,
CompletionToken&& token);
Completion signature: void(error_code ec, results_type r).
Effects: Let S1 and S2 be implementation-defined values that are sufficiently large to hold the host name and service name respectively. Initiates an asynchronous operation to resolve an endpoint as if by POSIX:
char host_name[S1]; char service_name[S2]; int flags = 0; if (endpoint_type().protocol().type() == SOCK_DGRAM) flags |= NI_DGRAM; int result = getnameinfo((const sockaddr*)e.data(), e.size(), host_name, S1, service_name, S2, flags); if (result != 0){ flags |= NI_NUMERICSERV; result = getnameinfo((const sockaddr*)e.data(), e.size(), host_name, S1, service_name, S2, flags); }
On success, r is a results object with size() == 1 containing the results of the resolve operation; otherwise, r is results_type().