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