Home | History | Annotate | Download | only in ip
      1 //
      2 // ip/basic_endpoint.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_ENDPOINT_HPP
     12 #define ASIO_IP_BASIC_ENDPOINT_HPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 #include "asio/ip/address.hpp"
     17 #include "asio/ip/detail/endpoint.hpp"
     18 
     19 
     20 #include "asio/detail/push_options.hpp"
     21 
     22 namespace asio {
     23 namespace ip {
     24 
     25 /// Describes an endpoint for a version-independent IP socket.
     26 /**
     27  * The asio::ip::basic_endpoint class template describes an endpoint that
     28  * may be associated with a particular socket.
     29  *
     30  * @par Thread Safety
     31  * @e Distinct @e objects: Safe.@n
     32  * @e Shared @e objects: Unsafe.
     33  *
     34  * @par Concepts:
     35  * Endpoint.
     36  */
     37 template <typename InternetProtocol>
     38 class basic_endpoint
     39 {
     40 public:
     41   /// The protocol type associated with the endpoint.
     42   typedef InternetProtocol protocol_type;
     43 
     44   /// The type of the endpoint structure. This type is dependent on the
     45   /// underlying implementation of the socket layer.
     46   typedef asio::detail::socket_addr_type data_type;
     47 
     48   /// Default constructor.
     49   basic_endpoint()
     50     : impl_()
     51   {
     52   }
     53 
     54   /// Construct an endpoint using a port number, specified in the host's byte
     55   /// order. The IP address will be the any address (i.e. INADDR_ANY or
     56   /// in6addr_any). This constructor would typically be used for accepting new
     57   /// connections.
     58   /**
     59    * @par Examples
     60    * To initialise an IPv4 TCP endpoint for port 1234, use:
     61    * @code
     62    * asio::ip::tcp::endpoint ep(asio::ip::tcp::v4(), 1234);
     63    * @endcode
     64    *
     65    * To specify an IPv6 UDP endpoint for port 9876, use:
     66    * @code
     67    * asio::ip::udp::endpoint ep(asio::ip::udp::v6(), 9876);
     68    * @endcode
     69    */
     70   basic_endpoint(const InternetProtocol& internet_protocol,
     71       unsigned short port_num)
     72     : impl_(internet_protocol.family(), port_num)
     73   {
     74   }
     75 
     76   /// Construct an endpoint using a port number and an IP address. This
     77   /// constructor may be used for accepting connections on a specific interface
     78   /// or for making a connection to a remote endpoint.
     79   basic_endpoint(const asio::ip::address& addr, unsigned short port_num)
     80     : impl_(addr, port_num)
     81   {
     82   }
     83 
     84   /// Copy constructor.
     85   basic_endpoint(const basic_endpoint& other)
     86     : impl_(other.impl_)
     87   {
     88   }
     89 
     90   /// Move constructor.
     91   basic_endpoint(basic_endpoint&& other)
     92     : impl_(other.impl_)
     93   {
     94   }
     95 
     96   /// Assign from another endpoint.
     97   basic_endpoint& operator=(const basic_endpoint& other)
     98   {
     99     impl_ = other.impl_;
    100     return *this;
    101   }
    102 
    103   /// Move-assign from another endpoint.
    104   basic_endpoint& operator=(basic_endpoint&& other)
    105   {
    106     impl_ = other.impl_;
    107     return *this;
    108   }
    109 
    110   /// The protocol associated with the endpoint.
    111   protocol_type protocol() const
    112   {
    113     if (impl_.is_v4())
    114       return InternetProtocol::v4();
    115     return InternetProtocol::v6();
    116   }
    117 
    118   /// Get the underlying endpoint in the native type.
    119   data_type* data()
    120   {
    121     return impl_.data();
    122   }
    123 
    124   /// Get the underlying endpoint in the native type.
    125   const data_type* data() const
    126   {
    127     return impl_.data();
    128   }
    129 
    130   /// Get the underlying size of the endpoint in the native type.
    131   std::size_t size() const
    132   {
    133     return impl_.size();
    134   }
    135 
    136   /// Set the underlying size of the endpoint in the native type.
    137   void resize(std::size_t new_size)
    138   {
    139     impl_.resize(new_size);
    140   }
    141 
    142   /// Get the capacity of the endpoint in the native type.
    143   std::size_t capacity() const
    144   {
    145     return impl_.capacity();
    146   }
    147 
    148   /// Get the port associated with the endpoint. The port number is always in
    149   /// the host's byte order.
    150   unsigned short port() const
    151   {
    152     return impl_.port();
    153   }
    154 
    155   /// Set the port associated with the endpoint. The port number is always in
    156   /// the host's byte order.
    157   void port(unsigned short port_num)
    158   {
    159     impl_.port(port_num);
    160   }
    161 
    162   /// Get the IP address associated with the endpoint.
    163   asio::ip::address address() const
    164   {
    165     return impl_.address();
    166   }
    167 
    168   /// Set the IP address associated with the endpoint.
    169   void address(const asio::ip::address& addr)
    170   {
    171     impl_.address(addr);
    172   }
    173 
    174   /// Compare two endpoints for equality.
    175   friend bool operator==(const basic_endpoint<InternetProtocol>& e1,
    176       const basic_endpoint<InternetProtocol>& e2)
    177   {
    178     return e1.impl_ == e2.impl_;
    179   }
    180 
    181   /// Compare two endpoints for inequality.
    182   friend bool operator!=(const basic_endpoint<InternetProtocol>& e1,
    183       const basic_endpoint<InternetProtocol>& e2)
    184   {
    185     return !(e1 == e2);
    186   }
    187 
    188   /// Compare endpoints for ordering.
    189   friend bool operator<(const basic_endpoint<InternetProtocol>& e1,
    190       const basic_endpoint<InternetProtocol>& e2)
    191   {
    192     return e1.impl_ < e2.impl_;
    193   }
    194 
    195   /// Compare endpoints for ordering.
    196   friend bool operator>(const basic_endpoint<InternetProtocol>& e1,
    197       const basic_endpoint<InternetProtocol>& e2)
    198   {
    199     return e2.impl_ < e1.impl_;
    200   }
    201 
    202   /// Compare endpoints for ordering.
    203   friend bool operator<=(const basic_endpoint<InternetProtocol>& e1,
    204       const basic_endpoint<InternetProtocol>& e2)
    205   {
    206     return !(e2 < e1);
    207   }
    208 
    209   /// Compare endpoints for ordering.
    210   friend bool operator>=(const basic_endpoint<InternetProtocol>& e1,
    211       const basic_endpoint<InternetProtocol>& e2)
    212   {
    213     return !(e1 < e2);
    214   }
    215 
    216 private:
    217   // The underlying IP endpoint.
    218   asio::ip::detail::endpoint impl_;
    219 };
    220 
    221 
    222 } // namespace ip
    223 } // namespace asio
    224 
    225 #include "asio/detail/pop_options.hpp"
    226 
    227 #include "asio/ip/impl/basic_endpoint.hpp"
    228 
    229 #endif // ASIO_IP_BASIC_ENDPOINT_HPP
    230