1//
2// ip/address_v6.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_ADDRESS_V6_HPP
12#define ASIO_IP_ADDRESS_V6_HPP
13
14
15#include "asio/detail/config.hpp"
16#include <string>
17#include "asio/detail/array.hpp"
18#include "asio/detail/socket_types.hpp"
19#include "asio/detail/winsock_init.hpp"
20#include "asio/error_code.hpp"
21#include "asio/ip/address_v4.hpp"
22
23
24#include "asio/detail/push_options.hpp"
25
26namespace asio {
27namespace ip {
28
29/// Implements IP version 6 style addresses.
30/**
31 * The asio::ip::address_v6 class provides the ability to use and
32 * manipulate IP version 6 addresses.
33 *
34 * @par Thread Safety
35 * @e Distinct @e objects: Safe.@n
36 * @e Shared @e objects: Unsafe.
37 */
38class address_v6
39{
40public:
41  /// The type used to represent an address as an array of bytes.
42  /**
43   * @note This type is defined in terms of the C++0x template @c std::array
44   * when it is available. Otherwise, it uses @c boost:array.
45   */
46  typedef asio::detail::array<unsigned char, 16> bytes_type;
47
48  /// Default constructor.
49  ASIO_DECL address_v6();
50
51  /// Construct an address from raw bytes and scope ID.
52  ASIO_DECL explicit address_v6(const bytes_type& bytes,
53      unsigned long scope_id = 0);
54
55  /// Copy constructor.
56  ASIO_DECL address_v6(const address_v6& other);
57
58  /// Move constructor.
59  ASIO_DECL address_v6(address_v6&& other);
60
61  /// Assign from another address.
62  ASIO_DECL address_v6& operator=(const address_v6& other);
63
64  /// Move-assign from another address.
65  ASIO_DECL address_v6& operator=(address_v6&& other);
66
67  /// The scope ID of the address.
68  /**
69   * Returns the scope ID associated with the IPv6 address.
70   */
71  unsigned long scope_id() const
72  {
73    return scope_id_;
74  }
75
76  /// The scope ID of the address.
77  /**
78   * Modifies the scope ID associated with the IPv6 address.
79   */
80  void scope_id(unsigned long id)
81  {
82    scope_id_ = id;
83  }
84
85  /// Get the address in bytes, in network byte order.
86  ASIO_DECL bytes_type to_bytes() const;
87
88  /// Get the address as a string.
89  ASIO_DECL std::string to_string() const;
90
91  /// Get the address as a string.
92  ASIO_DECL std::string to_string(asio::error_code& ec) const;
93
94  /// Create an address from an IP address string.
95  ASIO_DECL static address_v6 from_string(const char* str);
96
97  /// Create an address from an IP address string.
98  ASIO_DECL static address_v6 from_string(
99      const char* str, asio::error_code& ec);
100
101  /// Create an address from an IP address string.
102  ASIO_DECL static address_v6 from_string(const std::string& str);
103
104  /// Create an address from an IP address string.
105  ASIO_DECL static address_v6 from_string(
106      const std::string& str, asio::error_code& ec);
107
108  /// Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address.
109  ASIO_DECL address_v4 to_v4() const;
110
111  /// Determine whether the address is a loopback address.
112  ASIO_DECL bool is_loopback() const;
113
114  /// Determine whether the address is unspecified.
115  ASIO_DECL bool is_unspecified() const;
116
117  /// Determine whether the address is link local.
118  ASIO_DECL bool is_link_local() const;
119
120  /// Determine whether the address is site local.
121  ASIO_DECL bool is_site_local() const;
122
123  /// Determine whether the address is a mapped IPv4 address.
124  ASIO_DECL bool is_v4_mapped() const;
125
126  /// Determine whether the address is an IPv4-compatible address.
127  ASIO_DECL bool is_v4_compatible() const;
128
129  /// Determine whether the address is a multicast address.
130  ASIO_DECL bool is_multicast() const;
131
132  /// Determine whether the address is a global multicast address.
133  ASIO_DECL bool is_multicast_global() const;
134
135  /// Determine whether the address is a link-local multicast address.
136  ASIO_DECL bool is_multicast_link_local() const;
137
138  /// Determine whether the address is a node-local multicast address.
139  ASIO_DECL bool is_multicast_node_local() const;
140
141  /// Determine whether the address is a org-local multicast address.
142  ASIO_DECL bool is_multicast_org_local() const;
143
144  /// Determine whether the address is a site-local multicast address.
145  ASIO_DECL bool is_multicast_site_local() const;
146
147  /// Compare two addresses for equality.
148  ASIO_DECL friend bool operator==(
149      const address_v6& a1, const address_v6& a2);
150
151  /// Compare two addresses for inequality.
152  friend bool operator!=(const address_v6& a1, const address_v6& a2)
153  {
154    return !(a1 == a2);
155  }
156
157  /// Compare addresses for ordering.
158  ASIO_DECL friend bool operator<(
159      const address_v6& a1, const address_v6& a2);
160
161  /// Compare addresses for ordering.
162  friend bool operator>(const address_v6& a1, const address_v6& a2)
163  {
164    return a2 < a1;
165  }
166
167  /// Compare addresses for ordering.
168  friend bool operator<=(const address_v6& a1, const address_v6& a2)
169  {
170    return !(a2 < a1);
171  }
172
173  /// Compare addresses for ordering.
174  friend bool operator>=(const address_v6& a1, const address_v6& a2)
175  {
176    return !(a1 < a2);
177  }
178
179  /// Obtain an address object that represents any address.
180  static address_v6 any()
181  {
182    return address_v6();
183  }
184
185  /// Obtain an address object that represents the loopback address.
186  ASIO_DECL static address_v6 loopback();
187
188  /// Create an IPv4-mapped IPv6 address.
189  ASIO_DECL static address_v6 v4_mapped(const address_v4& addr);
190
191  /// Create an IPv4-compatible IPv6 address.
192  ASIO_DECL static address_v6 v4_compatible(const address_v4& addr);
193
194private:
195  // The underlying IPv6 address.
196  asio::detail::in6_addr_type addr_;
197
198  // The scope ID associated with the address.
199  unsigned long scope_id_;
200};
201
202
203} // namespace ip
204} // namespace asio
205
206#include "asio/detail/pop_options.hpp"
207
208#include "asio/ip/impl/address_v6.hpp"
209# include "asio/ip/impl/address_v6.ipp"
210
211#endif // ASIO_IP_ADDRESS_V6_HPP
212