10ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// 20ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// ip/address.hpp 30ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// ~~~~~~~~~~~~~~ 40ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// 50ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) 60ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// 70ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// Distributed under the Boost Software License, Version 1.0. (See accompanying 80ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 90ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// 100ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 110ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#ifndef ASIO_IP_ADDRESS_HPP 120ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#define ASIO_IP_ADDRESS_HPP 130ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 140ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 150ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/detail/config.hpp" 160ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include <string> 170ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/error_code.hpp" 180ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/ip/address_v4.hpp" 190ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/ip/address_v6.hpp" 200ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 210ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 220ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/detail/push_options.hpp" 230ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 240ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffienamespace asio { 250ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffienamespace ip { 260ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 270ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie/// Implements version-independent IP addresses. 280ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie/** 290ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * The asio::ip::address class provides the ability to use either IP 300ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * version 4 or version 6 addresses. 310ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * 320ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * @par Thread Safety 330ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * @e Distinct @e objects: Safe.@n 340ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * @e Shared @e objects: Unsafe. 350ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie */ 360ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffieclass address 370ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie{ 380ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffiepublic: 390ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Default constructor. 400ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL address(); 410ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 420ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Construct an address from an IPv4 address. 430ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL address(const asio::ip::address_v4& ipv4_address); 440ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 450ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Construct an address from an IPv6 address. 460ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL address(const asio::ip::address_v6& ipv6_address); 470ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 480ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Copy constructor. 490ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL address(const address& other); 500ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 510ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Move constructor. 520ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL address(address&& other); 530ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 540ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Assign from another address. 550ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL address& operator=(const address& other); 560ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 570ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Move-assign from another address. 580ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL address& operator=(address&& other); 590ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 600ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Assign from an IPv4 address. 610ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL address& operator=( 620ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie const asio::ip::address_v4& ipv4_address); 630ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 640ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Assign from an IPv6 address. 650ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL address& operator=( 660ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie const asio::ip::address_v6& ipv6_address); 670ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 680ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Get whether the address is an IP version 4 address. 690ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie bool is_v4() const 700ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie { 710ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie return type_ == ipv4; 720ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie } 730ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 740ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Get whether the address is an IP version 6 address. 750ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie bool is_v6() const 760ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie { 770ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie return type_ == ipv6; 780ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie } 790ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 800ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Get the address as an IP version 4 address. 810ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL asio::ip::address_v4 to_v4() const; 820ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 830ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Get the address as an IP version 6 address. 840ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL asio::ip::address_v6 to_v6() const; 850ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 860ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Get the address as a string in dotted decimal format. 870ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL std::string to_string() const; 880ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 890ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Get the address as a string in dotted decimal format. 900ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL std::string to_string(asio::error_code& ec) const; 910ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 920ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Create an address from an IPv4 address string in dotted decimal form, 930ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// or from an IPv6 address in hexadecimal notation. 940ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL static address from_string(const char* str); 950ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 960ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Create an address from an IPv4 address string in dotted decimal form, 970ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// or from an IPv6 address in hexadecimal notation. 980ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL static address from_string( 990ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie const char* str, asio::error_code& ec); 1000ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1010ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Create an address from an IPv4 address string in dotted decimal form, 1020ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// or from an IPv6 address in hexadecimal notation. 1030ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL static address from_string(const std::string& str); 1040ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1050ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Create an address from an IPv4 address string in dotted decimal form, 1060ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// or from an IPv6 address in hexadecimal notation. 1070ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL static address from_string( 1080ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie const std::string& str, asio::error_code& ec); 1090ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1100ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Determine whether the address is a loopback address. 1110ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL bool is_loopback() const; 1120ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1130ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Determine whether the address is unspecified. 1140ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL bool is_unspecified() const; 1150ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1160ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Determine whether the address is a multicast address. 1170ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL bool is_multicast() const; 1180ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1190ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Compare two addresses for equality. 1200ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL friend bool operator==(const address& a1, const address& a2); 1210ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1220ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Compare two addresses for inequality. 1230ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie friend bool operator!=(const address& a1, const address& a2) 1240ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie { 1250ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie return !(a1 == a2); 1260ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie } 1270ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1280ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Compare addresses for ordering. 1290ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie ASIO_DECL friend bool operator<(const address& a1, const address& a2); 1300ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1310ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Compare addresses for ordering. 1320ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie friend bool operator>(const address& a1, const address& a2) 1330ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie { 1340ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie return a2 < a1; 1350ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie } 1360ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1370ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Compare addresses for ordering. 1380ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie friend bool operator<=(const address& a1, const address& a2) 1390ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie { 1400ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie return !(a2 < a1); 1410ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie } 1420ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1430ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie /// Compare addresses for ordering. 1440ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie friend bool operator>=(const address& a1, const address& a2) 1450ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie { 1460ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie return !(a1 < a2); 1470ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie } 1480ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1490ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffieprivate: 1500ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie // The type of the address. 1510ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie enum { ipv4, ipv6 } type_; 1520ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1530ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie // The underlying IPv4 address. 1540ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie asio::ip::address_v4 ipv4_address_; 1550ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1560ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie // The underlying IPv6 address. 1570ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie asio::ip::address_v6 ipv6_address_; 1580ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie}; 1590ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1600ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1610ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie} // namespace ip 1620ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie} // namespace asio 1630ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1640ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/detail/pop_options.hpp" 1650ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1660ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/ip/impl/address.hpp" 1670ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie# include "asio/ip/impl/address.ipp" 1680ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie 1690ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#endif // ASIO_IP_ADDRESS_HPP 170