292 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			292 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			C++
		
	
	
	
| //
 | |
| // ip/basic_endpoint.hpp
 | |
| // ~~~~~~~~~~~~~~~~~~~~~
 | |
| //
 | |
| // Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com)
 | |
| //
 | |
| // Distributed under the Boost Software License, Version 1.0. (See accompanying
 | |
| // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 | |
| //
 | |
| 
 | |
| #ifndef ASIO_IP_BASIC_ENDPOINT_HPP
 | |
| #define ASIO_IP_BASIC_ENDPOINT_HPP
 | |
| 
 | |
| #if defined(_MSC_VER) && (_MSC_VER >= 1200)
 | |
| # pragma once
 | |
| #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 | |
| 
 | |
| #include "asio/detail/config.hpp"
 | |
| #include "asio/detail/cstdint.hpp"
 | |
| #include "asio/ip/address.hpp"
 | |
| #include "asio/ip/detail/endpoint.hpp"
 | |
| 
 | |
| #if defined(ASIO_HAS_STD_HASH)
 | |
| # include <functional>
 | |
| #endif // defined(ASIO_HAS_STD_HASH)
 | |
| 
 | |
| #if !defined(ASIO_NO_IOSTREAM)
 | |
| # include <iosfwd>
 | |
| #endif // !defined(ASIO_NO_IOSTREAM)
 | |
| 
 | |
| #include "asio/detail/push_options.hpp"
 | |
| 
 | |
| namespace asio {
 | |
| namespace ip {
 | |
| 
 | |
| /// Type used for storing port numbers.
 | |
| typedef uint_least16_t port_type;
 | |
| 
 | |
| /// Describes an endpoint for a version-independent IP socket.
 | |
| /**
 | |
|  * The asio::ip::basic_endpoint class template describes an endpoint that
 | |
|  * may be associated with a particular socket.
 | |
|  *
 | |
|  * @par Thread Safety
 | |
|  * @e Distinct @e objects: Safe.@n
 | |
|  * @e Shared @e objects: Unsafe.
 | |
|  *
 | |
|  * @par Concepts:
 | |
|  * Endpoint.
 | |
|  */
 | |
| template <typename InternetProtocol>
 | |
| class basic_endpoint
 | |
| {
 | |
| public:
 | |
|   /// The protocol type associated with the endpoint.
 | |
|   typedef InternetProtocol protocol_type;
 | |
| 
 | |
|   /// The type of the endpoint structure. This type is dependent on the
 | |
|   /// underlying implementation of the socket layer.
 | |
| #if defined(GENERATING_DOCUMENTATION)
 | |
|   typedef implementation_defined data_type;
 | |
| #else
 | |
|   typedef asio::detail::socket_addr_type data_type;
 | |
| #endif
 | |
| 
 | |
|   /// Default constructor.
 | |
|   basic_endpoint() ASIO_NOEXCEPT
 | |
|     : impl_()
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   /// Construct an endpoint using a port number, specified in the host's byte
 | |
|   /// order. The IP address will be the any address (i.e. INADDR_ANY or
 | |
|   /// in6addr_any). This constructor would typically be used for accepting new
 | |
|   /// connections.
 | |
|   /**
 | |
|    * @par Examples
 | |
|    * To initialise an IPv4 TCP endpoint for port 1234, use:
 | |
|    * @code
 | |
|    * asio::ip::tcp::endpoint ep(asio::ip::tcp::v4(), 1234);
 | |
|    * @endcode
 | |
|    *
 | |
|    * To specify an IPv6 UDP endpoint for port 9876, use:
 | |
|    * @code
 | |
|    * asio::ip::udp::endpoint ep(asio::ip::udp::v6(), 9876);
 | |
|    * @endcode
 | |
|    */
 | |
|   basic_endpoint(const InternetProtocol& internet_protocol,
 | |
|       port_type port_num) ASIO_NOEXCEPT
 | |
|     : impl_(internet_protocol.family(), port_num)
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   /// Construct an endpoint using a port number and an IP address. This
 | |
|   /// constructor may be used for accepting connections on a specific interface
 | |
|   /// or for making a connection to a remote endpoint.
 | |
|   basic_endpoint(const asio::ip::address& addr,
 | |
|       port_type port_num) ASIO_NOEXCEPT
 | |
|     : impl_(addr, port_num)
 | |
|   {
 | |
|   }
 | |
| 
 | |
|   /// Copy constructor.
 | |
|   basic_endpoint(const basic_endpoint& other) ASIO_NOEXCEPT
 | |
|     : impl_(other.impl_)
 | |
|   {
 | |
|   }
 | |
| 
 | |
| #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 | |
|   /// Move constructor.
 | |
|   basic_endpoint(basic_endpoint&& other) ASIO_NOEXCEPT
 | |
|     : impl_(other.impl_)
 | |
|   {
 | |
|   }
 | |
| #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 | |
| 
 | |
|   /// Assign from another endpoint.
 | |
|   basic_endpoint& operator=(const basic_endpoint& other) ASIO_NOEXCEPT
 | |
|   {
 | |
|     impl_ = other.impl_;
 | |
|     return *this;
 | |
|   }
 | |
| 
 | |
| #if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 | |
|   /// Move-assign from another endpoint.
 | |
|   basic_endpoint& operator=(basic_endpoint&& other) ASIO_NOEXCEPT
 | |
|   {
 | |
|     impl_ = other.impl_;
 | |
|     return *this;
 | |
|   }
 | |
| #endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
 | |
| 
 | |
|   /// The protocol associated with the endpoint.
 | |
|   protocol_type protocol() const ASIO_NOEXCEPT
 | |
|   {
 | |
|     if (impl_.is_v4())
 | |
|       return InternetProtocol::v4();
 | |
|     return InternetProtocol::v6();
 | |
|   }
 | |
| 
 | |
|   /// Get the underlying endpoint in the native type.
 | |
|   data_type* data() ASIO_NOEXCEPT
 | |
|   {
 | |
|     return impl_.data();
 | |
|   }
 | |
| 
 | |
|   /// Get the underlying endpoint in the native type.
 | |
|   const data_type* data() const ASIO_NOEXCEPT
 | |
|   {
 | |
|     return impl_.data();
 | |
|   }
 | |
| 
 | |
|   /// Get the underlying size of the endpoint in the native type.
 | |
|   std::size_t size() const ASIO_NOEXCEPT
 | |
|   {
 | |
|     return impl_.size();
 | |
|   }
 | |
| 
 | |
|   /// Set the underlying size of the endpoint in the native type.
 | |
|   void resize(std::size_t new_size)
 | |
|   {
 | |
|     impl_.resize(new_size);
 | |
|   }
 | |
| 
 | |
|   /// Get the capacity of the endpoint in the native type.
 | |
|   std::size_t capacity() const ASIO_NOEXCEPT
 | |
|   {
 | |
|     return impl_.capacity();
 | |
|   }
 | |
| 
 | |
|   /// Get the port associated with the endpoint. The port number is always in
 | |
|   /// the host's byte order.
 | |
|   port_type port() const ASIO_NOEXCEPT
 | |
|   {
 | |
|     return impl_.port();
 | |
|   }
 | |
| 
 | |
|   /// Set the port associated with the endpoint. The port number is always in
 | |
|   /// the host's byte order.
 | |
|   void port(port_type port_num) ASIO_NOEXCEPT
 | |
|   {
 | |
|     impl_.port(port_num);
 | |
|   }
 | |
| 
 | |
|   /// Get the IP address associated with the endpoint.
 | |
|   asio::ip::address address() const ASIO_NOEXCEPT
 | |
|   {
 | |
|     return impl_.address();
 | |
|   }
 | |
| 
 | |
|   /// Set the IP address associated with the endpoint.
 | |
|   void address(const asio::ip::address& addr) ASIO_NOEXCEPT
 | |
|   {
 | |
|     impl_.address(addr);
 | |
|   }
 | |
| 
 | |
|   /// Compare two endpoints for equality.
 | |
|   friend bool operator==(const basic_endpoint<InternetProtocol>& e1,
 | |
|       const basic_endpoint<InternetProtocol>& e2) ASIO_NOEXCEPT
 | |
|   {
 | |
|     return e1.impl_ == e2.impl_;
 | |
|   }
 | |
| 
 | |
|   /// Compare two endpoints for inequality.
 | |
|   friend bool operator!=(const basic_endpoint<InternetProtocol>& e1,
 | |
|       const basic_endpoint<InternetProtocol>& e2) ASIO_NOEXCEPT
 | |
|   {
 | |
|     return !(e1 == e2);
 | |
|   }
 | |
| 
 | |
|   /// Compare endpoints for ordering.
 | |
|   friend bool operator<(const basic_endpoint<InternetProtocol>& e1,
 | |
|       const basic_endpoint<InternetProtocol>& e2) ASIO_NOEXCEPT
 | |
|   {
 | |
|     return e1.impl_ < e2.impl_;
 | |
|   }
 | |
| 
 | |
|   /// Compare endpoints for ordering.
 | |
|   friend bool operator>(const basic_endpoint<InternetProtocol>& e1,
 | |
|       const basic_endpoint<InternetProtocol>& e2) ASIO_NOEXCEPT
 | |
|   {
 | |
|     return e2.impl_ < e1.impl_;
 | |
|   }
 | |
| 
 | |
|   /// Compare endpoints for ordering.
 | |
|   friend bool operator<=(const basic_endpoint<InternetProtocol>& e1,
 | |
|       const basic_endpoint<InternetProtocol>& e2) ASIO_NOEXCEPT
 | |
|   {
 | |
|     return !(e2 < e1);
 | |
|   }
 | |
| 
 | |
|   /// Compare endpoints for ordering.
 | |
|   friend bool operator>=(const basic_endpoint<InternetProtocol>& e1,
 | |
|       const basic_endpoint<InternetProtocol>& e2) ASIO_NOEXCEPT
 | |
|   {
 | |
|     return !(e1 < e2);
 | |
|   }
 | |
| 
 | |
| private:
 | |
|   // The underlying IP endpoint.
 | |
|   asio::ip::detail::endpoint impl_;
 | |
| };
 | |
| 
 | |
| #if !defined(ASIO_NO_IOSTREAM)
 | |
| 
 | |
| /// Output an endpoint as a string.
 | |
| /**
 | |
|  * Used to output a human-readable string for a specified endpoint.
 | |
|  *
 | |
|  * @param os The output stream to which the string will be written.
 | |
|  *
 | |
|  * @param endpoint The endpoint to be written.
 | |
|  *
 | |
|  * @return The output stream.
 | |
|  *
 | |
|  * @relates asio::ip::basic_endpoint
 | |
|  */
 | |
| template <typename Elem, typename Traits, typename InternetProtocol>
 | |
| std::basic_ostream<Elem, Traits>& operator<<(
 | |
|     std::basic_ostream<Elem, Traits>& os,
 | |
|     const basic_endpoint<InternetProtocol>& endpoint);
 | |
| 
 | |
| #endif // !defined(ASIO_NO_IOSTREAM)
 | |
| 
 | |
| } // namespace ip
 | |
| } // namespace asio
 | |
| 
 | |
| #if defined(ASIO_HAS_STD_HASH)
 | |
| namespace std {
 | |
| 
 | |
| template <typename InternetProtocol>
 | |
| struct hash<asio::ip::basic_endpoint<InternetProtocol> >
 | |
| {
 | |
|   std::size_t operator()(
 | |
|       const asio::ip::basic_endpoint<InternetProtocol>& ep)
 | |
|     const ASIO_NOEXCEPT
 | |
|   {
 | |
|     std::size_t hash1 = std::hash<asio::ip::address>()(ep.address());
 | |
|     std::size_t hash2 = std::hash<unsigned short>()(ep.port());
 | |
|     return hash1 ^ (hash2 + 0x9e3779b9 + (hash1 << 6) + (hash1 >> 2));
 | |
|   }
 | |
| };
 | |
| 
 | |
| } // namespace std
 | |
| #endif // defined(ASIO_HAS_STD_HASH)
 | |
| 
 | |
| #include "asio/detail/pop_options.hpp"
 | |
| 
 | |
| #include "asio/ip/impl/basic_endpoint.hpp"
 | |
| 
 | |
| #endif // ASIO_IP_BASIC_ENDPOINT_HPP
 |