Home | History | Annotate | Download | only in detail
      1 //
      2 // ip/detail/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_DETAIL_ENDPOINT_HPP
     12 #define ASIO_IP_DETAIL_ENDPOINT_HPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 #include <string>
     17 #include "asio/detail/socket_types.hpp"
     18 #include "asio/detail/winsock_init.hpp"
     19 #include "asio/error_code.hpp"
     20 #include "asio/ip/address.hpp"
     21 
     22 #include "asio/detail/push_options.hpp"
     23 
     24 namespace asio {
     25 namespace ip {
     26 namespace detail {
     27 
     28 // Helper class for implementating an IP endpoint.
     29 class endpoint
     30 {
     31 public:
     32   // Default constructor.
     33   ASIO_DECL endpoint();
     34 
     35   // Construct an endpoint using a family and port number.
     36   ASIO_DECL endpoint(int family, unsigned short port_num);
     37 
     38   // Construct an endpoint using an address and port number.
     39   ASIO_DECL endpoint(const asio::ip::address& addr,
     40       unsigned short port_num);
     41 
     42   // Copy constructor.
     43   endpoint(const endpoint& other)
     44     : data_(other.data_)
     45   {
     46   }
     47 
     48   // Assign from another endpoint.
     49   endpoint& operator=(const endpoint& other)
     50   {
     51     data_ = other.data_;
     52     return *this;
     53   }
     54 
     55   // Get the underlying endpoint in the native type.
     56   asio::detail::socket_addr_type* data()
     57   {
     58     return &data_.base;
     59   }
     60 
     61   // Get the underlying endpoint in the native type.
     62   const asio::detail::socket_addr_type* data() const
     63   {
     64     return &data_.base;
     65   }
     66 
     67   // Get the underlying size of the endpoint in the native type.
     68   std::size_t size() const
     69   {
     70     if (is_v4())
     71       return sizeof(asio::detail::sockaddr_in4_type);
     72     else
     73       return sizeof(asio::detail::sockaddr_in6_type);
     74   }
     75 
     76   // Set the underlying size of the endpoint in the native type.
     77   ASIO_DECL void resize(std::size_t new_size);
     78 
     79   // Get the capacity of the endpoint in the native type.
     80   std::size_t capacity() const
     81   {
     82     return sizeof(data_);
     83   }
     84 
     85   // Get the port associated with the endpoint.
     86   ASIO_DECL unsigned short port() const;
     87 
     88   // Set the port associated with the endpoint.
     89   ASIO_DECL void port(unsigned short port_num);
     90 
     91   // Get the IP address associated with the endpoint.
     92   ASIO_DECL asio::ip::address address() const;
     93 
     94   // Set the IP address associated with the endpoint.
     95   ASIO_DECL void address(const asio::ip::address& addr);
     96 
     97   // Compare two endpoints for equality.
     98   ASIO_DECL friend bool operator==(
     99       const endpoint& e1, const endpoint& e2);
    100 
    101   // Compare endpoints for ordering.
    102   ASIO_DECL friend bool operator<(
    103       const endpoint& e1, const endpoint& e2);
    104 
    105   // Determine whether the endpoint is IPv4.
    106   bool is_v4() const
    107   {
    108     return data_.base.sa_family == ASIO_OS_DEF(AF_INET);
    109   }
    110 
    111 
    112 private:
    113   // The underlying IP socket address.
    114   union data_union
    115   {
    116     asio::detail::socket_addr_type base;
    117     asio::detail::sockaddr_in4_type v4;
    118     asio::detail::sockaddr_in6_type v6;
    119   } data_;
    120 };
    121 
    122 } // namespace detail
    123 } // namespace ip
    124 } // namespace asio
    125 
    126 #include "asio/detail/pop_options.hpp"
    127 
    128 # include "asio/ip/detail/impl/endpoint.ipp"
    129 
    130 #endif // ASIO_IP_DETAIL_ENDPOINT_HPP
    131