Home | History | Annotate | Download | only in ip
      1 //
      2 // ip/basic_resolver_query.hpp
      3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
      4 //
      5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
      6 //
      7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
      8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
      9 //
     10 
     11 #ifndef ASIO_IP_BASIC_RESOLVER_QUERY_HPP
     12 #define ASIO_IP_BASIC_RESOLVER_QUERY_HPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 #include <string>
     17 #include "asio/detail/socket_ops.hpp"
     18 #include "asio/ip/resolver_query_base.hpp"
     19 
     20 #include "asio/detail/push_options.hpp"
     21 
     22 namespace asio {
     23 namespace ip {
     24 
     25 /// An query to be passed to a resolver.
     26 /**
     27  * The asio::ip::basic_resolver_query class template describes a query
     28  * that can be passed to a resolver.
     29  *
     30  * @par Thread Safety
     31  * @e Distinct @e objects: Safe.@n
     32  * @e Shared @e objects: Unsafe.
     33  */
     34 template <typename InternetProtocol>
     35 class basic_resolver_query
     36   : public resolver_query_base
     37 {
     38 public:
     39   /// The protocol type associated with the endpoint query.
     40   typedef InternetProtocol protocol_type;
     41 
     42   /// Construct with specified service name for any protocol.
     43   /**
     44    * This constructor is typically used to perform name resolution for local
     45    * service binding.
     46    *
     47    * @param service A string identifying the requested service. This may be a
     48    * descriptive name or a numeric string corresponding to a port number.
     49    *
     50    * @param resolve_flags A set of flags that determine how name resolution
     51    * should be performed. The default flags are suitable for local service
     52    * binding.
     53    *
     54    * @note On POSIX systems, service names are typically defined in the file
     55    * <tt>/etc/services</tt>. On Windows, service names may be found in the file
     56    * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
     57    * may use additional locations when resolving service names.
     58    */
     59   basic_resolver_query(const std::string& service,
     60       resolver_query_base::flags resolve_flags = passive | address_configured)
     61     : hints_(),
     62       host_name_(),
     63       service_name_(service)
     64   {
     65     typename InternetProtocol::endpoint endpoint;
     66     hints_.ai_flags = static_cast<int>(resolve_flags);
     67     hints_.ai_family = PF_UNSPEC;
     68     hints_.ai_socktype = endpoint.protocol().type();
     69     hints_.ai_protocol = endpoint.protocol().protocol();
     70     hints_.ai_addrlen = 0;
     71     hints_.ai_canonname = 0;
     72     hints_.ai_addr = 0;
     73     hints_.ai_next = 0;
     74   }
     75 
     76   /// Construct with specified service name for a given protocol.
     77   /**
     78    * This constructor is typically used to perform name resolution for local
     79    * service binding with a specific protocol version.
     80    *
     81    * @param protocol A protocol object, normally representing either the IPv4 or
     82    * IPv6 version of an internet protocol.
     83    *
     84    * @param service A string identifying the requested service. This may be a
     85    * descriptive name or a numeric string corresponding to a port number.
     86    *
     87    * @param resolve_flags A set of flags that determine how name resolution
     88    * should be performed. The default flags are suitable for local service
     89    * binding.
     90    *
     91    * @note On POSIX systems, service names are typically defined in the file
     92    * <tt>/etc/services</tt>. On Windows, service names may be found in the file
     93    * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
     94    * may use additional locations when resolving service names.
     95    */
     96   basic_resolver_query(const protocol_type& protocol,
     97       const std::string& service,
     98       resolver_query_base::flags resolve_flags = passive | address_configured)
     99     : hints_(),
    100       host_name_(),
    101       service_name_(service)
    102   {
    103     hints_.ai_flags = static_cast<int>(resolve_flags);
    104     hints_.ai_family = protocol.family();
    105     hints_.ai_socktype = protocol.type();
    106     hints_.ai_protocol = protocol.protocol();
    107     hints_.ai_addrlen = 0;
    108     hints_.ai_canonname = 0;
    109     hints_.ai_addr = 0;
    110     hints_.ai_next = 0;
    111   }
    112 
    113   /// Construct with specified host name and service name for any protocol.
    114   /**
    115    * This constructor is typically used to perform name resolution for
    116    * communication with remote hosts.
    117    *
    118    * @param host A string identifying a location. May be a descriptive name or
    119    * a numeric address string. If an empty string and the passive flag has been
    120    * specified, the resolved endpoints are suitable for local service binding.
    121    * If an empty string and passive is not specified, the resolved endpoints
    122    * will use the loopback address.
    123    *
    124    * @param service A string identifying the requested service. This may be a
    125    * descriptive name or a numeric string corresponding to a port number. May
    126    * be an empty string, in which case all resolved endpoints will have a port
    127    * number of 0.
    128    *
    129    * @param resolve_flags A set of flags that determine how name resolution
    130    * should be performed. The default flags are suitable for communication with
    131    * remote hosts.
    132    *
    133    * @note On POSIX systems, host names may be locally defined in the file
    134    * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
    135    * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. Remote host name
    136    * resolution is performed using DNS. Operating systems may use additional
    137    * locations when resolving host names (such as NETBIOS names on Windows).
    138    *
    139    * On POSIX systems, service names are typically defined in the file
    140    * <tt>/etc/services</tt>. On Windows, service names may be found in the file
    141    * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
    142    * may use additional locations when resolving service names.
    143    */
    144   basic_resolver_query(const std::string& host, const std::string& service,
    145       resolver_query_base::flags resolve_flags = address_configured)
    146     : hints_(),
    147       host_name_(host),
    148       service_name_(service)
    149   {
    150     typename InternetProtocol::endpoint endpoint;
    151     hints_.ai_flags = static_cast<int>(resolve_flags);
    152     hints_.ai_family = ASIO_OS_DEF(AF_UNSPEC);
    153     hints_.ai_socktype = endpoint.protocol().type();
    154     hints_.ai_protocol = endpoint.protocol().protocol();
    155     hints_.ai_addrlen = 0;
    156     hints_.ai_canonname = 0;
    157     hints_.ai_addr = 0;
    158     hints_.ai_next = 0;
    159   }
    160 
    161   /// Construct with specified host name and service name for a given protocol.
    162   /**
    163    * This constructor is typically used to perform name resolution for
    164    * communication with remote hosts.
    165    *
    166    * @param protocol A protocol object, normally representing either the IPv4 or
    167    * IPv6 version of an internet protocol.
    168    *
    169    * @param host A string identifying a location. May be a descriptive name or
    170    * a numeric address string. If an empty string and the passive flag has been
    171    * specified, the resolved endpoints are suitable for local service binding.
    172    * If an empty string and passive is not specified, the resolved endpoints
    173    * will use the loopback address.
    174    *
    175    * @param service A string identifying the requested service. This may be a
    176    * descriptive name or a numeric string corresponding to a port number. May
    177    * be an empty string, in which case all resolved endpoints will have a port
    178    * number of 0.
    179    *
    180    * @param resolve_flags A set of flags that determine how name resolution
    181    * should be performed. The default flags are suitable for communication with
    182    * remote hosts.
    183    *
    184    * @note On POSIX systems, host names may be locally defined in the file
    185    * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
    186    * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. Remote host name
    187    * resolution is performed using DNS. Operating systems may use additional
    188    * locations when resolving host names (such as NETBIOS names on Windows).
    189    *
    190    * On POSIX systems, service names are typically defined in the file
    191    * <tt>/etc/services</tt>. On Windows, service names may be found in the file
    192    * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
    193    * may use additional locations when resolving service names.
    194    */
    195   basic_resolver_query(const protocol_type& protocol,
    196       const std::string& host, const std::string& service,
    197       resolver_query_base::flags resolve_flags = address_configured)
    198     : hints_(),
    199       host_name_(host),
    200       service_name_(service)
    201   {
    202     hints_.ai_flags = static_cast<int>(resolve_flags);
    203     hints_.ai_family = protocol.family();
    204     hints_.ai_socktype = protocol.type();
    205     hints_.ai_protocol = protocol.protocol();
    206     hints_.ai_addrlen = 0;
    207     hints_.ai_canonname = 0;
    208     hints_.ai_addr = 0;
    209     hints_.ai_next = 0;
    210   }
    211 
    212   /// Get the hints associated with the query.
    213   const asio::detail::addrinfo_type& hints() const
    214   {
    215     return hints_;
    216   }
    217 
    218   /// Get the host name associated with the query.
    219   std::string host_name() const
    220   {
    221     return host_name_;
    222   }
    223 
    224   /// Get the service name associated with the query.
    225   std::string service_name() const
    226   {
    227     return service_name_;
    228   }
    229 
    230 private:
    231   asio::detail::addrinfo_type hints_;
    232   std::string host_name_;
    233   std::string service_name_;
    234 };
    235 
    236 } // namespace ip
    237 } // namespace asio
    238 
    239 #include "asio/detail/pop_options.hpp"
    240 
    241 #endif // ASIO_IP_BASIC_RESOLVER_QUERY_HPP
    242