diff options
Diffstat (limited to '3rdParty/Boost/src/boost/asio/ip')
18 files changed, 3660 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/asio/ip/address.hpp b/3rdParty/Boost/src/boost/asio/ip/address.hpp new file mode 100644 index 0000000..9f1836e --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/address.hpp @@ -0,0 +1,279 @@ +// +// address.hpp +// ~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_ADDRESS_HPP +#define BOOST_ASIO_IP_ADDRESS_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <iosfwd> +#include <string> +#include <boost/throw_exception.hpp> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/error.hpp> +#include <boost/asio/ip/address_v4.hpp> +#include <boost/asio/ip/address_v6.hpp> +#include <boost/asio/detail/throw_error.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Implements version-independent IP addresses. +/** + * The boost::asio::ip::address class provides the ability to use either IP + * version 4 or version 6 addresses. + * + * @par Thread Safety + * @e Distinct @e objects: Safe.@n + * @e Shared @e objects: Unsafe. + */ +class address +{ +public: +  /// Default constructor. +  address() +    : type_(ipv4), +      ipv4_address_(), +      ipv6_address_() +  { +  } + +  /// Construct an address from an IPv4 address. +  address(const boost::asio::ip::address_v4& ipv4_address) +    : type_(ipv4), +      ipv4_address_(ipv4_address), +      ipv6_address_() +  { +  } + +  /// Construct an address from an IPv6 address. +  address(const boost::asio::ip::address_v6& ipv6_address) +    : type_(ipv6), +      ipv4_address_(), +      ipv6_address_(ipv6_address) +  { +  } + +  /// Copy constructor. +  address(const address& other) +    : type_(other.type_), +      ipv4_address_(other.ipv4_address_), +      ipv6_address_(other.ipv6_address_) +  { +  } + +  /// Assign from another address. +  address& operator=(const address& other) +  { +    type_ = other.type_; +    ipv4_address_ = other.ipv4_address_; +    ipv6_address_ = other.ipv6_address_; +    return *this; +  } + +  /// Assign from an IPv4 address. +  address& operator=(const boost::asio::ip::address_v4& ipv4_address) +  { +    type_ = ipv4; +    ipv4_address_ = ipv4_address; +    ipv6_address_ = boost::asio::ip::address_v6(); +    return *this; +  } + +  /// Assign from an IPv6 address. +  address& operator=(const boost::asio::ip::address_v6& ipv6_address) +  { +    type_ = ipv6; +    ipv4_address_ = boost::asio::ip::address_v4(); +    ipv6_address_ = ipv6_address; +    return *this; +  } + +  /// Get whether the address is an IP version 4 address. +  bool is_v4() const +  { +    return type_ == ipv4; +  } + +  /// Get whether the address is an IP version 6 address. +  bool is_v6() const +  { +    return type_ == ipv6; +  } + +  /// Get the address as an IP version 4 address. +  boost::asio::ip::address_v4 to_v4() const +  { +    if (type_ != ipv4) +    { +      boost::system::system_error e( +          boost::asio::error::address_family_not_supported); +      boost::throw_exception(e); +    } +    return ipv4_address_; +  } + +  /// Get the address as an IP version 6 address. +  boost::asio::ip::address_v6 to_v6() const +  { +    if (type_ != ipv6) +    { +      boost::system::system_error e( +          boost::asio::error::address_family_not_supported); +      boost::throw_exception(e); +    } +    return ipv6_address_; +  } + +  /// Get the address as a string in dotted decimal format. +  std::string to_string() const +  { +    if (type_ == ipv6) +      return ipv6_address_.to_string(); +    return ipv4_address_.to_string(); +  } + +  /// Get the address as a string in dotted decimal format. +  std::string to_string(boost::system::error_code& ec) const +  { +    if (type_ == ipv6) +      return ipv6_address_.to_string(ec); +    return ipv4_address_.to_string(ec); +  } + +  /// Create an address from an IPv4 address string in dotted decimal form, +  /// or from an IPv6 address in hexadecimal notation. +  static address from_string(const char* str) +  { +    boost::system::error_code ec; +    address addr = from_string(str, ec); +    boost::asio::detail::throw_error(ec); +    return addr; +  } + +  /// Create an address from an IPv4 address string in dotted decimal form, +  /// or from an IPv6 address in hexadecimal notation. +  static address from_string(const char* str, boost::system::error_code& ec) +  { +    boost::asio::ip::address_v6 ipv6_address = +      boost::asio::ip::address_v6::from_string(str, ec); +    if (!ec) +    { +      address tmp; +      tmp.type_ = ipv6; +      tmp.ipv6_address_ = ipv6_address; +      return tmp; +    } + +    boost::asio::ip::address_v4 ipv4_address = +      boost::asio::ip::address_v4::from_string(str, ec); +    if (!ec) +    { +      address tmp; +      tmp.type_ = ipv4; +      tmp.ipv4_address_ = ipv4_address; +      return tmp; +    } + +    return address(); +  } + +  /// Create an address from an IPv4 address string in dotted decimal form, +  /// or from an IPv6 address in hexadecimal notation. +  static address from_string(const std::string& str) +  { +    return from_string(str.c_str()); +  } + +  /// Create an address from an IPv4 address string in dotted decimal form, +  /// or from an IPv6 address in hexadecimal notation. +  static address from_string(const std::string& str, +      boost::system::error_code& ec) +  { +    return from_string(str.c_str(), ec); +  } + +  /// Compare two addresses for equality. +  friend bool operator==(const address& a1, const address& a2) +  { +    if (a1.type_ != a2.type_) +      return false; +    if (a1.type_ == ipv6) +      return a1.ipv6_address_ == a2.ipv6_address_; +    return a1.ipv4_address_ == a2.ipv4_address_; +  } + +  /// Compare two addresses for inequality. +  friend bool operator!=(const address& a1, const address& a2) +  { +    if (a1.type_ != a2.type_) +      return true; +    if (a1.type_ == ipv6) +      return a1.ipv6_address_ != a2.ipv6_address_; +    return a1.ipv4_address_ != a2.ipv4_address_; +  } + +  /// Compare addresses for ordering. +  friend bool operator<(const address& a1, const address& a2) +  { +    if (a1.type_ < a2.type_) +      return true; +    if (a1.type_ > a2.type_) +      return false; +    if (a1.type_ == ipv6) +      return a1.ipv6_address_ < a2.ipv6_address_; +    return a1.ipv4_address_ < a2.ipv4_address_; +  } + +private: +  // The type of the address. +  enum { ipv4, ipv6 } type_; + +  // The underlying IPv4 address. +  boost::asio::ip::address_v4 ipv4_address_; + +  // The underlying IPv6 address. +  boost::asio::ip::address_v6 ipv6_address_; +}; + +/// Output an address as a string. +/** + * Used to output a human-readable string for a specified address. + * + * @param os The output stream to which the string will be written. + * + * @param addr The address to be written. + * + * @return The output stream. + * + * @relates boost::asio::ip::address + */ +template <typename Elem, typename Traits> +std::basic_ostream<Elem, Traits>& operator<<( +    std::basic_ostream<Elem, Traits>& os, const address& addr) +{ +  os << addr.to_string(); +  return os; +} + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_ADDRESS_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/address_v4.hpp b/3rdParty/Boost/src/boost/asio/ip/address_v4.hpp new file mode 100644 index 0000000..357edfa --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/address_v4.hpp @@ -0,0 +1,309 @@ +// +// address_v4.hpp +// ~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_ADDRESS_V4_HPP +#define BOOST_ASIO_IP_ADDRESS_V4_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <climits> +#include <string> +#include <stdexcept> +#include <boost/array.hpp> +#include <boost/throw_exception.hpp> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/error.hpp> +#include <boost/asio/detail/socket_ops.hpp> +#include <boost/asio/detail/socket_types.hpp> +#include <boost/asio/detail/throw_error.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Implements IP version 4 style addresses. +/** + * The boost::asio::ip::address_v4 class provides the ability to use and + * manipulate IP version 4 addresses. + * + * @par Thread Safety + * @e Distinct @e objects: Safe.@n + * @e Shared @e objects: Unsafe. + */ +class address_v4 +{ +public: +  /// The type used to represent an address as an array of bytes. +  typedef boost::array<unsigned char, 4> bytes_type; + +  /// Default constructor. +  address_v4() +  { +    addr_.s_addr = 0; +  } + +  /// Construct an address from raw bytes. +  explicit address_v4(const bytes_type& bytes) +  { +#if UCHAR_MAX > 0xFF +    if (bytes[0] > 0xFF || bytes[1] > 0xFF +        || bytes[2] > 0xFF || bytes[3] > 0xFF) +    { +      std::out_of_range ex("address_v4 from bytes_type"); +      boost::throw_exception(ex); +    } +#endif // UCHAR_MAX > 0xFF + +    using namespace std; // For memcpy. +    memcpy(&addr_.s_addr, bytes.elems, 4); +  } + +  /// Construct an address from a unsigned long in host byte order. +  explicit address_v4(unsigned long addr) +  { +#if ULONG_MAX > 0xFFFFFFFF +    if (addr > 0xFFFFFFFF) +    { +      std::out_of_range ex("address_v4 from unsigned long"); +      boost::throw_exception(ex); +    } +#endif // ULONG_MAX > 0xFFFFFFFF + +    addr_.s_addr = boost::asio::detail::socket_ops::host_to_network_long(addr); +  } + +  /// Copy constructor. +  address_v4(const address_v4& other) +    : addr_(other.addr_) +  { +  } + +  /// Assign from another address. +  address_v4& operator=(const address_v4& other) +  { +    addr_ = other.addr_; +    return *this; +  } + +  /// Get the address in bytes. +  bytes_type to_bytes() const +  { +    using namespace std; // For memcpy. +    bytes_type bytes; +    memcpy(bytes.elems, &addr_.s_addr, 4); +    return bytes; +  } + +  /// Get the address as an unsigned long in host byte order +  unsigned long to_ulong() const +  { +    return boost::asio::detail::socket_ops::network_to_host_long(addr_.s_addr); +  } + +  /// Get the address as a string in dotted decimal format. +  std::string to_string() const +  { +    boost::system::error_code ec; +    std::string addr = to_string(ec); +    boost::asio::detail::throw_error(ec); +    return addr; +  } + +  /// Get the address as a string in dotted decimal format. +  std::string to_string(boost::system::error_code& ec) const +  { +    char addr_str[boost::asio::detail::max_addr_v4_str_len]; +    const char* addr = +      boost::asio::detail::socket_ops::inet_ntop(AF_INET, &addr_, addr_str, +          boost::asio::detail::max_addr_v4_str_len, 0, ec); +    if (addr == 0) +      return std::string(); +    return addr; +  } + +  /// Create an address from an IP address string in dotted decimal form. +  static address_v4 from_string(const char* str) +  { +    boost::system::error_code ec; +    address_v4 addr = from_string(str, ec); +    boost::asio::detail::throw_error(ec); +    return addr; +  } + +  /// Create an address from an IP address string in dotted decimal form. +  static address_v4 from_string(const char* str, boost::system::error_code& ec) +  { +    address_v4 tmp; +    if (boost::asio::detail::socket_ops::inet_pton( +          AF_INET, str, &tmp.addr_, 0, ec) <= 0) +      return address_v4(); +    return tmp; +  } + +  /// Create an address from an IP address string in dotted decimal form. +  static address_v4 from_string(const std::string& str) +  { +    return from_string(str.c_str()); +  } + +  /// Create an address from an IP address string in dotted decimal form. +  static address_v4 from_string(const std::string& str, +      boost::system::error_code& ec) +  { +    return from_string(str.c_str(), ec); +  } + +  /// Determine whether the address is a class A address. +  bool is_class_a() const +  { +    return IN_CLASSA(to_ulong()); +  } + +  /// Determine whether the address is a class B address. +  bool is_class_b() const +  { +    return IN_CLASSB(to_ulong()); +  } + +  /// Determine whether the address is a class C address. +  bool is_class_c() const +  { +    return IN_CLASSC(to_ulong()); +  } + +  /// Determine whether the address is a multicast address. +  bool is_multicast() const +  { +    return IN_MULTICAST(to_ulong()); +  } + +  /// Compare two addresses for equality. +  friend bool operator==(const address_v4& a1, const address_v4& a2) +  { +    return a1.addr_.s_addr == a2.addr_.s_addr; +  } + +  /// Compare two addresses for inequality. +  friend bool operator!=(const address_v4& a1, const address_v4& a2) +  { +    return a1.addr_.s_addr != a2.addr_.s_addr; +  } + +  /// Compare addresses for ordering. +  friend bool operator<(const address_v4& a1, const address_v4& a2) +  { +    return a1.to_ulong() < a2.to_ulong(); +  } + +  /// Compare addresses for ordering. +  friend bool operator>(const address_v4& a1, const address_v4& a2) +  { +    return a1.to_ulong() > a2.to_ulong(); +  } + +  /// Compare addresses for ordering. +  friend bool operator<=(const address_v4& a1, const address_v4& a2) +  { +    return a1.to_ulong() <= a2.to_ulong(); +  } + +  /// Compare addresses for ordering. +  friend bool operator>=(const address_v4& a1, const address_v4& a2) +  { +    return a1.to_ulong() >= a2.to_ulong(); +  } + +  /// Obtain an address object that represents any address. +  static address_v4 any() +  { +    return address_v4(static_cast<unsigned long>(INADDR_ANY)); +  } + +  /// Obtain an address object that represents the loopback address. +  static address_v4 loopback() +  { +    return address_v4(static_cast<unsigned long>(INADDR_LOOPBACK)); +  } + +  /// Obtain an address object that represents the broadcast address. +  static address_v4 broadcast() +  { +    return address_v4(static_cast<unsigned long>(INADDR_BROADCAST)); +  } + +  /// Obtain an address object that represents the broadcast address that +  /// corresponds to the specified address and netmask. +  static address_v4 broadcast(const address_v4& addr, const address_v4& mask) +  { +    return address_v4(addr.to_ulong() | ~mask.to_ulong()); +  } + +  /// Obtain the netmask that corresponds to the address, based on its address +  /// class. +  static address_v4 netmask(const address_v4& addr) +  { +    if (addr.is_class_a()) +      return address_v4(0xFF000000); +    if (addr.is_class_b()) +      return address_v4(0xFFFF0000); +    if (addr.is_class_c()) +      return address_v4(0xFFFFFF00); +    return address_v4(0xFFFFFFFF); +  } + +private: +  // The underlying IPv4 address. +  boost::asio::detail::in4_addr_type addr_; +}; + +/// Output an address as a string. +/** + * Used to output a human-readable string for a specified address. + * + * @param os The output stream to which the string will be written. + * + * @param addr The address to be written. + * + * @return The output stream. + * + * @relates boost::asio::ip::address_v4 + */ +template <typename Elem, typename Traits> +std::basic_ostream<Elem, Traits>& operator<<( +    std::basic_ostream<Elem, Traits>& os, const address_v4& addr) +{ +  boost::system::error_code ec; +  std::string s = addr.to_string(ec); +  if (ec) +  { +    if (os.exceptions() & std::ios::failbit) +      boost::asio::detail::throw_error(ec); +    else +      os.setstate(std::ios_base::failbit); +  } +  else +    for (std::string::iterator i = s.begin(); i != s.end(); ++i) +      os << os.widen(*i); +  return os; +} + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_ADDRESS_V4_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/address_v6.hpp b/3rdParty/Boost/src/boost/asio/ip/address_v6.hpp new file mode 100644 index 0000000..5f5f092 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/address_v6.hpp @@ -0,0 +1,423 @@ +// +// address_v6.hpp +// ~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_ADDRESS_V6_HPP +#define BOOST_ASIO_IP_ADDRESS_V6_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <cstring> +#include <string> +#include <stdexcept> +#include <typeinfo> +#include <boost/array.hpp> +#include <boost/throw_exception.hpp> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/error.hpp> +#include <boost/asio/detail/socket_ops.hpp> +#include <boost/asio/detail/socket_types.hpp> +#include <boost/asio/detail/throw_error.hpp> +#include <boost/asio/ip/address_v4.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Implements IP version 6 style addresses. +/** + * The boost::asio::ip::address_v6 class provides the ability to use and + * manipulate IP version 6 addresses. + * + * @par Thread Safety + * @e Distinct @e objects: Safe.@n + * @e Shared @e objects: Unsafe. + */ +class address_v6 +{ +public: +  /// The type used to represent an address as an array of bytes. +  typedef boost::array<unsigned char, 16> bytes_type; + +  /// Default constructor. +  address_v6() +    : scope_id_(0) +  { +    boost::asio::detail::in6_addr_type tmp_addr = IN6ADDR_ANY_INIT; +    addr_ = tmp_addr; +  } + +  /// Construct an address from raw bytes and scope ID. +  explicit address_v6(const bytes_type& bytes, unsigned long scope_id = 0) +    : scope_id_(scope_id) +  { +#if UCHAR_MAX > 0xFF +    for (std::size_t i = 0; i < bytes.size(); ++i) +    { +      if (bytes[i] > 0xFF) +      { +        std::out_of_range ex("address_v6 from bytes_type"); +        boost::throw_exception(ex); +      } +    } +#endif // UCHAR_MAX > 0xFF + +    using namespace std; // For memcpy. +    memcpy(addr_.s6_addr, bytes.elems, 16); +  } + +  /// Copy constructor. +  address_v6(const address_v6& other) +    : addr_(other.addr_), +      scope_id_(other.scope_id_) +  { +  } + +  /// Assign from another address. +  address_v6& operator=(const address_v6& other) +  { +    addr_ = other.addr_; +    scope_id_ = other.scope_id_; +    return *this; +  } + +  /// The scope ID of the address. +  /** +   * Returns the scope ID associated with the IPv6 address. +   */ +  unsigned long scope_id() const +  { +    return scope_id_; +  } + +  /// The scope ID of the address. +  /** +   * Modifies the scope ID associated with the IPv6 address. +   */ +  void scope_id(unsigned long id) +  { +    scope_id_ = id; +  } + +  /// Get the address in bytes. +  bytes_type to_bytes() const +  { +    using namespace std; // For memcpy. +    bytes_type bytes; +    memcpy(bytes.elems, addr_.s6_addr, 16); +    return bytes; +  } + +  /// Get the address as a string. +  std::string to_string() const +  { +    boost::system::error_code ec; +    std::string addr = to_string(ec); +    boost::asio::detail::throw_error(ec); +    return addr; +  } + +  /// Get the address as a string. +  std::string to_string(boost::system::error_code& ec) const +  { +    char addr_str[boost::asio::detail::max_addr_v6_str_len]; +    const char* addr = +      boost::asio::detail::socket_ops::inet_ntop(AF_INET6, &addr_, addr_str, +          boost::asio::detail::max_addr_v6_str_len, scope_id_, ec); +    if (addr == 0) +      return std::string(); +    return addr; +  } + +  /// Create an address from an IP address string. +  static address_v6 from_string(const char* str) +  { +    boost::system::error_code ec; +    address_v6 addr = from_string(str, ec); +    boost::asio::detail::throw_error(ec); +    return addr; +  } + +  /// Create an address from an IP address string. +  static address_v6 from_string(const char* str, boost::system::error_code& ec) +  { +    address_v6 tmp; +    if (boost::asio::detail::socket_ops::inet_pton( +          AF_INET6, str, &tmp.addr_, &tmp.scope_id_, ec) <= 0) +      return address_v6(); +    return tmp; +  } + +  /// Create an address from an IP address string. +  static address_v6 from_string(const std::string& str) +  { +    return from_string(str.c_str()); +  } + +  /// Create an address from an IP address string. +  static address_v6 from_string(const std::string& str, +      boost::system::error_code& ec) +  { +    return from_string(str.c_str(), ec); +  } + +  /// Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address. +  address_v4 to_v4() const +  { +    if (!is_v4_mapped() && !is_v4_compatible()) +    { +      std::bad_cast ex; +      boost::throw_exception(ex); +    } + +    address_v4::bytes_type v4_bytes = { { addr_.s6_addr[12], +      addr_.s6_addr[13], addr_.s6_addr[14], addr_.s6_addr[15] } }; +    return address_v4(v4_bytes); +  } + +  /// Determine whether the address is a loopback address. +  bool is_loopback() const +  { +#if defined(__BORLANDC__) +    return ((addr_.s6_addr[0] == 0) && (addr_.s6_addr[1] == 0) +        && (addr_.s6_addr[2] == 0) && (addr_.s6_addr[3] == 0) +        && (addr_.s6_addr[4] == 0) && (addr_.s6_addr[5] == 0) +        && (addr_.s6_addr[6] == 0) && (addr_.s6_addr[7] == 0) +        && (addr_.s6_addr[8] == 0) && (addr_.s6_addr[9] == 0) +        && (addr_.s6_addr[10] == 0) && (addr_.s6_addr[11] == 0) +        && (addr_.s6_addr[12] == 0) && (addr_.s6_addr[13] == 0) +        && (addr_.s6_addr[14] == 0) && (addr_.s6_addr[15] == 1)); +#else +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_LOOPBACK(&addr_) != 0; +#endif +  } + +  /// Determine whether the address is unspecified. +  bool is_unspecified() const +  { +#if defined(__BORLANDC__) +    return ((addr_.s6_addr[0] == 0) && (addr_.s6_addr[1] == 0) +        && (addr_.s6_addr[2] == 0) && (addr_.s6_addr[3] == 0) +        && (addr_.s6_addr[4] == 0) && (addr_.s6_addr[5] == 0) +        && (addr_.s6_addr[6] == 0) && (addr_.s6_addr[7] == 0) +        && (addr_.s6_addr[8] == 0) && (addr_.s6_addr[9] == 0) +        && (addr_.s6_addr[10] == 0) && (addr_.s6_addr[11] == 0) +        && (addr_.s6_addr[12] == 0) && (addr_.s6_addr[13] == 0) +        && (addr_.s6_addr[14] == 0) && (addr_.s6_addr[15] == 0)); +#else +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_UNSPECIFIED(&addr_) != 0; +#endif +  } + +  /// Determine whether the address is link local. +  bool is_link_local() const +  { +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_LINKLOCAL(&addr_) != 0; +  } + +  /// Determine whether the address is site local. +  bool is_site_local() const +  { +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_SITELOCAL(&addr_) != 0; +  } + +  /// Determine whether the address is a mapped IPv4 address. +  bool is_v4_mapped() const +  { +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_V4MAPPED(&addr_) != 0; +  } + +  /// Determine whether the address is an IPv4-compatible address. +  bool is_v4_compatible() const +  { +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_V4COMPAT(&addr_) != 0; +  } + +  /// Determine whether the address is a multicast address. +  bool is_multicast() const +  { +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_MULTICAST(&addr_) != 0; +  } + +  /// Determine whether the address is a global multicast address. +  bool is_multicast_global() const +  { +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_MC_GLOBAL(&addr_) != 0; +  } + +  /// Determine whether the address is a link-local multicast address. +  bool is_multicast_link_local() const +  { +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_MC_LINKLOCAL(&addr_) != 0; +  } + +  /// Determine whether the address is a node-local multicast address. +  bool is_multicast_node_local() const +  { +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_MC_NODELOCAL(&addr_) != 0; +  } + +  /// Determine whether the address is a org-local multicast address. +  bool is_multicast_org_local() const +  { +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_MC_ORGLOCAL(&addr_) != 0; +  } + +  /// Determine whether the address is a site-local multicast address. +  bool is_multicast_site_local() const +  { +    using namespace boost::asio::detail; +    return IN6_IS_ADDR_MC_SITELOCAL(&addr_) != 0; +  } + +  /// Compare two addresses for equality. +  friend bool operator==(const address_v6& a1, const address_v6& a2) +  { +    using namespace std; // For memcmp. +    return memcmp(&a1.addr_, &a2.addr_, +        sizeof(boost::asio::detail::in6_addr_type)) == 0 +      && a1.scope_id_ == a2.scope_id_; +  } + +  /// Compare two addresses for inequality. +  friend bool operator!=(const address_v6& a1, const address_v6& a2) +  { +    using namespace std; // For memcmp. +    return memcmp(&a1.addr_, &a2.addr_, +        sizeof(boost::asio::detail::in6_addr_type)) != 0 +      || a1.scope_id_ != a2.scope_id_; +  } + +  /// Compare addresses for ordering. +  friend bool operator<(const address_v6& a1, const address_v6& a2) +  { +    using namespace std; // For memcmp. +    int memcmp_result = memcmp(&a1.addr_, &a2.addr_, +        sizeof(boost::asio::detail::in6_addr_type)); +    if (memcmp_result < 0) +      return true; +    if (memcmp_result > 0) +      return false; +    return a1.scope_id_ < a2.scope_id_; +  } + +  /// Compare addresses for ordering. +  friend bool operator>(const address_v6& a1, const address_v6& a2) +  { +    return a2 < a1; +  } + +  /// Compare addresses for ordering. +  friend bool operator<=(const address_v6& a1, const address_v6& a2) +  { +    return !(a2 < a1); +  } + +  /// Compare addresses for ordering. +  friend bool operator>=(const address_v6& a1, const address_v6& a2) +  { +    return !(a1 < a2); +  } + +  /// Obtain an address object that represents any address. +  static address_v6 any() +  { +    return address_v6(); +  } + +  /// Obtain an address object that represents the loopback address. +  static address_v6 loopback() +  { +    address_v6 tmp; +    boost::asio::detail::in6_addr_type tmp_addr = IN6ADDR_LOOPBACK_INIT; +    tmp.addr_ = tmp_addr; +    return tmp; +  } + +  /// Create an IPv4-mapped IPv6 address. +  static address_v6 v4_mapped(const address_v4& addr) +  { +    address_v4::bytes_type v4_bytes = addr.to_bytes(); +    bytes_type v6_bytes = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, +      v4_bytes[0], v4_bytes[1], v4_bytes[2], v4_bytes[3] } }; +    return address_v6(v6_bytes); +  } + +  /// Create an IPv4-compatible IPv6 address. +  static address_v6 v4_compatible(const address_v4& addr) +  { +    address_v4::bytes_type v4_bytes = addr.to_bytes(); +    bytes_type v6_bytes = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +      v4_bytes[0], v4_bytes[1], v4_bytes[2], v4_bytes[3] } }; +    return address_v6(v6_bytes); +  } + +private: +  // The underlying IPv6 address. +  boost::asio::detail::in6_addr_type addr_; + +  // The scope ID associated with the address. +  unsigned long scope_id_; +}; + +/// Output an address as a string. +/** + * Used to output a human-readable string for a specified address. + * + * @param os The output stream to which the string will be written. + * + * @param addr The address to be written. + * + * @return The output stream. + * + * @relates boost::asio::ip::address_v6 + */ +template <typename Elem, typename Traits> +std::basic_ostream<Elem, Traits>& operator<<( +    std::basic_ostream<Elem, Traits>& os, const address_v6& addr) +{ +  boost::system::error_code ec; +  std::string s = addr.to_string(ec); +  if (ec) +  { +    if (os.exceptions() & std::ios::failbit) +      boost::asio::detail::throw_error(ec); +    else +      os.setstate(std::ios_base::failbit); +  } +  else +    for (std::string::iterator i = s.begin(); i != s.end(); ++i) +      os << os.widen(*i); +  return os; +} + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_ADDRESS_V6_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/basic_endpoint.hpp b/3rdParty/Boost/src/boost/asio/ip/basic_endpoint.hpp new file mode 100644 index 0000000..80aaf1e --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/basic_endpoint.hpp @@ -0,0 +1,377 @@ +// +// basic_endpoint.hpp +// ~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_BASIC_ENDPOINT_HPP +#define BOOST_ASIO_IP_BASIC_ENDPOINT_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <boost/throw_exception.hpp> +#include <boost/detail/workaround.hpp> +#include <cstring> +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) +# include <ostream> +#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) +#include <sstream> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/error.hpp> +#include <boost/asio/ip/address.hpp> +#include <boost/asio/detail/socket_ops.hpp> +#include <boost/asio/detail/socket_types.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Describes an endpoint for a version-independent IP socket. +/** + * The boost::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 boost::asio::detail::socket_addr_type data_type; +#endif + +  /// Default constructor. +  basic_endpoint() +    : data_() +  { +    data_.v4.sin_family = AF_INET; +    data_.v4.sin_port = 0; +    data_.v4.sin_addr.s_addr = INADDR_ANY; +  } + +  /// 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 +   * boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::v4(), 1234); +   * @endcode +   * +   * To specify an IPv6 UDP endpoint for port 9876, use: +   * @code +   * boost::asio::ip::udp::endpoint ep(boost::asio::ip::udp::v6(), 9876); +   * @endcode +   */ +  basic_endpoint(const InternetProtocol& protocol, unsigned short port_num) +    : data_() +  { +    using namespace std; // For memcpy. +    if (protocol.family() == PF_INET) +    { +      data_.v4.sin_family = AF_INET; +      data_.v4.sin_port = +        boost::asio::detail::socket_ops::host_to_network_short(port_num); +      data_.v4.sin_addr.s_addr = INADDR_ANY; +    } +    else +    { +      data_.v6.sin6_family = AF_INET6; +      data_.v6.sin6_port = +        boost::asio::detail::socket_ops::host_to_network_short(port_num); +      data_.v6.sin6_flowinfo = 0; +      boost::asio::detail::in6_addr_type tmp_addr = IN6ADDR_ANY_INIT; +      data_.v6.sin6_addr = tmp_addr; +      data_.v6.sin6_scope_id = 0; +    } +  } + +  /// 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 boost::asio::ip::address& addr, unsigned short port_num) +    : data_() +  { +    using namespace std; // For memcpy. +    if (addr.is_v4()) +    { +      data_.v4.sin_family = AF_INET; +      data_.v4.sin_port = +        boost::asio::detail::socket_ops::host_to_network_short(port_num); +      data_.v4.sin_addr.s_addr = +        boost::asio::detail::socket_ops::host_to_network_long( +            addr.to_v4().to_ulong()); +    } +    else +    { +      data_.v6.sin6_family = AF_INET6; +      data_.v6.sin6_port = +        boost::asio::detail::socket_ops::host_to_network_short(port_num); +      data_.v6.sin6_flowinfo = 0; +      boost::asio::ip::address_v6 v6_addr = addr.to_v6(); +      boost::asio::ip::address_v6::bytes_type bytes = v6_addr.to_bytes(); +      memcpy(data_.v6.sin6_addr.s6_addr, bytes.elems, 16); +      data_.v6.sin6_scope_id = v6_addr.scope_id(); +    } +  } + +  /// Copy constructor. +  basic_endpoint(const basic_endpoint& other) +    : data_(other.data_) +  { +  } + +  /// Assign from another endpoint. +  basic_endpoint& operator=(const basic_endpoint& other) +  { +    data_ = other.data_; +    return *this; +  } + +  /// The protocol associated with the endpoint. +  protocol_type protocol() const +  { +    if (is_v4()) +      return InternetProtocol::v4(); +    return InternetProtocol::v6(); +  } + +  /// Get the underlying endpoint in the native type. +  data_type* data() +  { +    return &data_.base; +  } + +  /// Get the underlying endpoint in the native type. +  const data_type* data() const +  { +    return &data_.base; +  } + +  /// Get the underlying size of the endpoint in the native type. +  std::size_t size() const +  { +    if (is_v4()) +      return sizeof(boost::asio::detail::sockaddr_in4_type); +    else +      return sizeof(boost::asio::detail::sockaddr_in6_type); +  } + +  /// Set the underlying size of the endpoint in the native type. +  void resize(std::size_t size) +  { +    if (size > sizeof(boost::asio::detail::sockaddr_storage_type)) +    { +      boost::system::system_error e(boost::asio::error::invalid_argument); +      boost::throw_exception(e); +    } +  } + +  /// Get the capacity of the endpoint in the native type. +  std::size_t capacity() const +  { +    return sizeof(boost::asio::detail::sockaddr_storage_type); +  } + +  /// Get the port associated with the endpoint. The port number is always in +  /// the host's byte order. +  unsigned short port() const +  { +    if (is_v4()) +    { +      return boost::asio::detail::socket_ops::network_to_host_short( +          data_.v4.sin_port); +    } +    else +    { +      return boost::asio::detail::socket_ops::network_to_host_short( +          data_.v6.sin6_port); +    } +  } + +  /// Set the port associated with the endpoint. The port number is always in +  /// the host's byte order. +  void port(unsigned short port_num) +  { +    if (is_v4()) +    { +      data_.v4.sin_port +        = boost::asio::detail::socket_ops::host_to_network_short(port_num); +    } +    else +    { +      data_.v6.sin6_port +        = boost::asio::detail::socket_ops::host_to_network_short(port_num); +    } +  } + +  /// Get the IP address associated with the endpoint. +  boost::asio::ip::address address() const +  { +    using namespace std; // For memcpy. +    if (is_v4()) +    { +      return boost::asio::ip::address_v4( +          boost::asio::detail::socket_ops::network_to_host_long( +            data_.v4.sin_addr.s_addr)); +    } +    else +    { +      boost::asio::ip::address_v6::bytes_type bytes; +      memcpy(bytes.elems, data_.v6.sin6_addr.s6_addr, 16); +      return boost::asio::ip::address_v6(bytes, data_.v6.sin6_scope_id); +    } +  } + +  /// Set the IP address associated with the endpoint. +  void address(const boost::asio::ip::address& addr) +  { +    basic_endpoint<InternetProtocol> tmp_endpoint(addr, port()); +    data_ = tmp_endpoint.data_; +  } + +  /// Compare two endpoints for equality. +  friend bool operator==(const basic_endpoint<InternetProtocol>& e1, +      const basic_endpoint<InternetProtocol>& e2) +  { +    return e1.address() == e2.address() && e1.port() == e2.port(); +  } + +  /// Compare two endpoints for inequality. +  friend bool operator!=(const basic_endpoint<InternetProtocol>& e1, +      const basic_endpoint<InternetProtocol>& e2) +  { +    return e1.address() != e2.address() || e1.port() != e2.port(); +  } + +  /// Compare endpoints for ordering. +  friend bool operator<(const basic_endpoint<InternetProtocol>& e1, +      const basic_endpoint<InternetProtocol>& e2) +  { +    if (e1.address() < e2.address()) +      return true; +    if (e1.address() != e2.address()) +      return false; +    return e1.port() < e2.port(); +  } + +private: +  // Helper function to determine whether the endpoint is IPv4. +  bool is_v4() const +  { +    return data_.base.sa_family == AF_INET; +  } + +  // The underlying IP socket address. +  union data_union +  { +    boost::asio::detail::socket_addr_type base; +    boost::asio::detail::sockaddr_storage_type storage; +    boost::asio::detail::sockaddr_in4_type v4; +    boost::asio::detail::sockaddr_in6_type v6; +  } data_; +}; + +/// 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 boost::asio::ip::basic_endpoint + */ +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) +template <typename InternetProtocol> +std::ostream& operator<<(std::ostream& os, +    const basic_endpoint<InternetProtocol>& endpoint) +{ +  const address& addr = endpoint.address(); +  boost::system::error_code ec; +  std::string a = addr.to_string(ec); +  if (ec) +  { +    if (os.exceptions() & std::ios::failbit) +      boost::asio::detail::throw_error(ec); +    else +      os.setstate(std::ios_base::failbit); +  } +  else +  { +    std::ostringstream tmp_os; +    tmp_os.imbue(std::locale::classic()); +    if (addr.is_v4()) +      tmp_os << a; +    else +      tmp_os << '[' << a << ']'; +    tmp_os << ':' << endpoint.port(); +    os << tmp_os.str(); +  } +  return os; +} +#else // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) +template <typename Elem, typename Traits, typename InternetProtocol> +std::basic_ostream<Elem, Traits>& operator<<( +    std::basic_ostream<Elem, Traits>& os, +    const basic_endpoint<InternetProtocol>& endpoint) +{ +  const address& addr = endpoint.address(); +  boost::system::error_code ec; +  std::string a = addr.to_string(ec); +  if (ec) +  { +    if (os.exceptions() & std::ios::failbit) +      boost::asio::detail::throw_error(ec); +    else +      os.setstate(std::ios_base::failbit); +  } +  else +  { +    std::ostringstream tmp_os; +    tmp_os.imbue(std::locale::classic()); +    if (addr.is_v4()) +      tmp_os << a; +    else +      tmp_os << '[' << a << ']'; +    tmp_os << ':' << endpoint.port(); +    os << tmp_os.str(); +  } +  return os; +} +#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_BASIC_ENDPOINT_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/basic_resolver.hpp b/3rdParty/Boost/src/boost/asio/ip/basic_resolver.hpp new file mode 100644 index 0000000..d0e8eb8 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/basic_resolver.hpp @@ -0,0 +1,248 @@ +// +// basic_resolver.hpp +// ~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_BASIC_RESOLVER_HPP +#define BOOST_ASIO_IP_BASIC_RESOLVER_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/basic_io_object.hpp> +#include <boost/asio/error.hpp> +#include <boost/asio/ip/resolver_service.hpp> +#include <boost/asio/detail/throw_error.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Provides endpoint resolution functionality. +/** + * The basic_resolver class template provides the ability to resolve a query + * to a list of endpoints. + * + * @par Thread Safety + * @e Distinct @e objects: Safe.@n + * @e Shared @e objects: Unsafe. + */ +template <typename InternetProtocol, +    typename ResolverService = resolver_service<InternetProtocol> > +class basic_resolver +  : public basic_io_object<ResolverService> +{ +public: +  /// The protocol type. +  typedef InternetProtocol protocol_type; + +  /// The endpoint type. +  typedef typename InternetProtocol::endpoint endpoint_type; + +  /// The query type. +  typedef typename InternetProtocol::resolver_query query; + +  /// The iterator type. +  typedef typename InternetProtocol::resolver_iterator iterator; + +  /// Constructor. +  /** +   * This constructor creates a basic_resolver. +   * +   * @param io_service The io_service object that the resolver will use to +   * dispatch handlers for any asynchronous operations performed on the timer. +   */ +  explicit basic_resolver(boost::asio::io_service& io_service) +    : basic_io_object<ResolverService>(io_service) +  { +  } + +  /// Cancel any asynchronous operations that are waiting on the resolver. +  /** +   * This function forces the completion of any pending asynchronous +   * operations on the host resolver. The handler for each cancelled operation +   * will be invoked with the boost::asio::error::operation_aborted error code. +   */ +  void cancel() +  { +    return this->service.cancel(this->implementation); +  } + +  /// Perform forward resolution of a query to a list of entries. +  /** +   * This function is used to resolve a query into a list of endpoint entries. +   * +   * @param q A query object that determines what endpoints will be returned. +   * +   * @returns A forward-only iterator that can be used to traverse the list +   * of endpoint entries. +   * +   * @throws boost::system::system_error Thrown on failure. +   * +   * @note A default constructed iterator represents the end of the list. +   * +   * A successful call to this function is guaranteed to return at least one +   * entry. +   */ +  iterator resolve(const query& q) +  { +    boost::system::error_code ec; +    iterator i = this->service.resolve(this->implementation, q, ec); +    boost::asio::detail::throw_error(ec); +    return i; +  } + +  /// Perform forward resolution of a query to a list of entries. +  /** +   * This function is used to resolve a query into a list of endpoint entries. +   * +   * @param q A query object that determines what endpoints will be returned. +   * +   * @param ec Set to indicate what error occurred, if any. +   * +   * @returns A forward-only iterator that can be used to traverse the list +   * of endpoint entries. Returns a default constructed iterator if an error +   * occurs. +   * +   * @note A default constructed iterator represents the end of the list. +   * +   * A successful call to this function is guaranteed to return at least one +   * entry. +   */ +  iterator resolve(const query& q, boost::system::error_code& ec) +  { +    return this->service.resolve(this->implementation, q, ec); +  } + +  /// Asynchronously perform forward resolution of a query to a list of entries. +  /** +   * This function is used to asynchronously resolve a query into a list of +   * endpoint entries. +   * +   * @param q A query object that determines what endpoints will be returned. +   * +   * @param handler The handler to be called when the resolve operation +   * completes. Copies will be made of the handler as required. The function +   * signature of the handler must be: +   * @code void handler( +   *   const boost::system::error_code& error, // Result of operation. +   *   resolver::iterator iterator             // Forward-only iterator that can +   *                                           // be used to traverse the list +   *                                           // of endpoint entries. +   * ); @endcode +   * Regardless of whether the asynchronous operation completes immediately or +   * not, the handler will not be invoked from within this function. Invocation +   * of the handler will be performed in a manner equivalent to using +   * boost::asio::io_service::post(). +   * +   * @note A default constructed iterator represents the end of the list. +   * +   * A successful resolve operation is guaranteed to pass at least one entry to +   * the handler. +   */ +  template <typename ResolveHandler> +  void async_resolve(const query& q, ResolveHandler handler) +  { +    return this->service.async_resolve(this->implementation, q, handler); +  } + +  /// Perform reverse resolution of an endpoint to a list of entries. +  /** +   * This function is used to resolve an endpoint into a list of endpoint +   * entries. +   * +   * @param e An endpoint object that determines what endpoints will be +   * returned. +   * +   * @returns A forward-only iterator that can be used to traverse the list +   * of endpoint entries. +   * +   * @throws boost::system::system_error Thrown on failure. +   * +   * @note A default constructed iterator represents the end of the list. +   * +   * A successful call to this function is guaranteed to return at least one +   * entry. +   */ +  iterator resolve(const endpoint_type& e) +  { +    boost::system::error_code ec; +    iterator i = this->service.resolve(this->implementation, e, ec); +    boost::asio::detail::throw_error(ec); +    return i; +  } + +  /// Perform reverse resolution of an endpoint to a list of entries. +  /** +   * This function is used to resolve an endpoint into a list of endpoint +   * entries. +   * +   * @param e An endpoint object that determines what endpoints will be +   * returned. +   * +   * @param ec Set to indicate what error occurred, if any. +   * +   * @returns A forward-only iterator that can be used to traverse the list +   * of endpoint entries. Returns a default constructed iterator if an error +   * occurs. +   * +   * @note A default constructed iterator represents the end of the list. +   * +   * A successful call to this function is guaranteed to return at least one +   * entry. +   */ +  iterator resolve(const endpoint_type& e, boost::system::error_code& ec) +  { +    return this->service.resolve(this->implementation, e, ec); +  } + +  /// Asynchronously perform reverse resolution of an endpoint to a list of +  /// entries. +  /** +   * This function is used to asynchronously resolve an endpoint into a list of +   * endpoint entries. +   * +   * @param e An endpoint object that determines what endpoints will be +   * returned. +   * +   * @param handler The handler to be called when the resolve operation +   * completes. Copies will be made of the handler as required. The function +   * signature of the handler must be: +   * @code void handler( +   *   const boost::system::error_code& error, // Result of operation. +   *   resolver::iterator iterator             // Forward-only iterator that can +   *                                           // be used to traverse the list +   *                                           // of endpoint entries. +   * ); @endcode +   * Regardless of whether the asynchronous operation completes immediately or +   * not, the handler will not be invoked from within this function. Invocation +   * of the handler will be performed in a manner equivalent to using +   * boost::asio::io_service::post(). +   * +   * @note A default constructed iterator represents the end of the list. +   * +   * A successful resolve operation is guaranteed to pass at least one entry to +   * the handler. +   */ +  template <typename ResolveHandler> +  void async_resolve(const endpoint_type& e, ResolveHandler handler) +  { +    return this->service.async_resolve(this->implementation, e, handler); +  } +}; + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_BASIC_RESOLVER_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/basic_resolver_entry.hpp b/3rdParty/Boost/src/boost/asio/ip/basic_resolver_entry.hpp new file mode 100644 index 0000000..ba0a020 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/basic_resolver_entry.hpp @@ -0,0 +1,97 @@ +// +// basic_resolver_entry.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_BASIC_RESOLVER_ENTRY_HPP +#define BOOST_ASIO_IP_BASIC_RESOLVER_ENTRY_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <string> +#include <boost/asio/detail/pop_options.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// An entry produced by a resolver. +/** + * The boost::asio::ip::basic_resolver_entry class template describes an entry + * as returned by a resolver. + * + * @par Thread Safety + * @e Distinct @e objects: Safe.@n + * @e Shared @e objects: Unsafe. + */ +template <typename InternetProtocol> +class basic_resolver_entry +{ +public: +  /// The protocol type associated with the endpoint entry. +  typedef InternetProtocol protocol_type; + +  /// The endpoint type associated with the endpoint entry. +  typedef typename InternetProtocol::endpoint endpoint_type; + +  /// Default constructor. +  basic_resolver_entry() +  { +  } + +  /// Construct with specified endpoint, host name and service name. +  basic_resolver_entry(const endpoint_type& endpoint, +      const std::string& host_name, const std::string& service_name) +    : endpoint_(endpoint), +      host_name_(host_name), +      service_name_(service_name) +  { +  } + +  /// Get the endpoint associated with the entry. +  endpoint_type endpoint() const +  { +    return endpoint_; +  } + +  /// Convert to the endpoint associated with the entry. +  operator endpoint_type() const +  { +    return endpoint_; +  } + +  /// Get the host name associated with the entry. +  std::string host_name() const +  { +    return host_name_; +  } + +  /// Get the service name associated with the entry. +  std::string service_name() const +  { +    return service_name_; +  } + +private: +  endpoint_type endpoint_; +  std::string host_name_; +  std::string service_name_; +}; + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_BASIC_RESOLVER_ENTRY_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/basic_resolver_iterator.hpp b/3rdParty/Boost/src/boost/asio/ip/basic_resolver_iterator.hpp new file mode 100644 index 0000000..d5860b7 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/basic_resolver_iterator.hpp @@ -0,0 +1,156 @@ +// +// basic_resolver_iterator.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP +#define BOOST_ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <boost/iterator/iterator_facade.hpp> +#include <boost/optional.hpp> +#include <boost/shared_ptr.hpp> +#include <cstring> +#include <string> +#include <vector> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/detail/socket_ops.hpp> +#include <boost/asio/detail/socket_types.hpp> +#include <boost/asio/ip/basic_resolver_entry.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// An iterator over the entries produced by a resolver. +/** + * The boost::asio::ip::basic_resolver_iterator class template is used to define + * iterators over the results returned by a resolver. + * + * The iterator's value_type, obtained when the iterator is dereferenced, is: + * @code const basic_resolver_entry<InternetProtocol> @endcode + * + * @par Thread Safety + * @e Distinct @e objects: Safe.@n + * @e Shared @e objects: Unsafe. + */ +template <typename InternetProtocol> +class basic_resolver_iterator +  : public boost::iterator_facade< +        basic_resolver_iterator<InternetProtocol>, +        const basic_resolver_entry<InternetProtocol>, +        boost::forward_traversal_tag> +{ +public: +  /// Default constructor creates an end iterator. +  basic_resolver_iterator() +  { +  } + +  /// Create an iterator from an addrinfo list returned by getaddrinfo. +  static basic_resolver_iterator create( +      boost::asio::detail::addrinfo_type* address_info, +      const std::string& host_name, const std::string& service_name) +  { +    basic_resolver_iterator iter; +    if (!address_info) +      return iter; + +    std::string actual_host_name = host_name; +    if (address_info->ai_canonname) +      actual_host_name = address_info->ai_canonname; + +    iter.values_.reset(new values_type); + +    while (address_info) +    { +      if (address_info->ai_family == PF_INET +          || address_info->ai_family == PF_INET6) +      { +        using namespace std; // For memcpy. +        typename InternetProtocol::endpoint endpoint; +        endpoint.resize(static_cast<std::size_t>(address_info->ai_addrlen)); +        memcpy(endpoint.data(), address_info->ai_addr, +            address_info->ai_addrlen); +        iter.values_->push_back( +            basic_resolver_entry<InternetProtocol>(endpoint, +              actual_host_name, service_name)); +      } +      address_info = address_info->ai_next; +    } + +    if (iter.values_->size()) +      iter.iter_ = iter.values_->begin(); +    else +      iter.values_.reset(); + +    return iter; +  } + +  /// Create an iterator from an endpoint, host name and service name. +  static basic_resolver_iterator create( +      const typename InternetProtocol::endpoint& endpoint, +      const std::string& host_name, const std::string& service_name) +  { +    basic_resolver_iterator iter; +    iter.values_.reset(new values_type); +    iter.values_->push_back( +        basic_resolver_entry<InternetProtocol>( +          endpoint, host_name, service_name)); +    iter.iter_ = iter.values_->begin(); +    return iter; +  } + +private: +  friend class boost::iterator_core_access; + +  void increment() +  { +    if (++*iter_ == values_->end()) +    { +      // Reset state to match a default constructed end iterator. +      values_.reset(); +      typedef typename values_type::const_iterator values_iterator_type; +      iter_.reset(); +    } +  } + +  bool equal(const basic_resolver_iterator& other) const +  { +    if (!values_ && !other.values_) +      return true; +    if (values_ != other.values_) +      return false; +    return *iter_ == *other.iter_; +  } + +  const basic_resolver_entry<InternetProtocol>& dereference() const +  { +    return **iter_; +  } + +  typedef std::vector<basic_resolver_entry<InternetProtocol> > values_type; +  typedef typename values_type::const_iterator values_iter_type; +  boost::shared_ptr<values_type> values_; +  boost::optional<values_iter_type> iter_; +}; + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/basic_resolver_query.hpp b/3rdParty/Boost/src/boost/asio/ip/basic_resolver_query.hpp new file mode 100644 index 0000000..dd08525 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/basic_resolver_query.hpp @@ -0,0 +1,151 @@ +// +// basic_resolver_query.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_BASIC_RESOLVER_QUERY_HPP +#define BOOST_ASIO_IP_BASIC_RESOLVER_QUERY_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <boost/config.hpp> +#include <string> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/detail/socket_ops.hpp> +#include <boost/asio/ip/resolver_query_base.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// An query to be passed to a resolver. +/** + * The boost::asio::ip::basic_resolver_query class template describes a query + * that can be passed to a resolver. + * + * @par Thread Safety + * @e Distinct @e objects: Safe.@n + * @e Shared @e objects: Unsafe. + */ +template <typename InternetProtocol> +class basic_resolver_query +  : public resolver_query_base +{ +public: +  /// The protocol type associated with the endpoint query. +  typedef InternetProtocol protocol_type; + +  /// Construct with specified service name for any protocol. +  basic_resolver_query(const std::string& service_name, +      int flags = passive | address_configured) +    : hints_(), +      host_name_(), +      service_name_(service_name) +  { +    typename InternetProtocol::endpoint endpoint; +    hints_.ai_flags = flags; +    hints_.ai_family = PF_UNSPEC; +    hints_.ai_socktype = endpoint.protocol().type(); +    hints_.ai_protocol = endpoint.protocol().protocol(); +    hints_.ai_addrlen = 0; +    hints_.ai_canonname = 0; +    hints_.ai_addr = 0; +    hints_.ai_next = 0; +  } + +  /// Construct with specified service name for a given protocol. +  basic_resolver_query(const protocol_type& protocol, +      const std::string& service_name, +      int flags = passive | address_configured) +    : hints_(), +      host_name_(), +      service_name_(service_name) +  { +    hints_.ai_flags = flags; +    hints_.ai_family = protocol.family(); +    hints_.ai_socktype = protocol.type(); +    hints_.ai_protocol = protocol.protocol(); +    hints_.ai_addrlen = 0; +    hints_.ai_canonname = 0; +    hints_.ai_addr = 0; +    hints_.ai_next = 0; +  } + +  /// Construct with specified host name and service name for any protocol. +  basic_resolver_query(const std::string& host_name, +      const std::string& service_name, int flags = address_configured) +    : hints_(), +      host_name_(host_name), +      service_name_(service_name) +  { +    typename InternetProtocol::endpoint endpoint; +    hints_.ai_flags = flags; +    hints_.ai_family = PF_UNSPEC; +    hints_.ai_socktype = endpoint.protocol().type(); +    hints_.ai_protocol = endpoint.protocol().protocol(); +    hints_.ai_addrlen = 0; +    hints_.ai_canonname = 0; +    hints_.ai_addr = 0; +    hints_.ai_next = 0; +  } + +  /// Construct with specified host name and service name for a given protocol. +  basic_resolver_query(const protocol_type& protocol, +      const std::string& host_name, const std::string& service_name, +      int flags = address_configured) +    : hints_(), +      host_name_(host_name), +      service_name_(service_name) +  { +    hints_.ai_flags = flags; +    hints_.ai_family = protocol.family(); +    hints_.ai_socktype = protocol.type(); +    hints_.ai_protocol = protocol.protocol(); +    hints_.ai_addrlen = 0; +    hints_.ai_canonname = 0; +    hints_.ai_addr = 0; +    hints_.ai_next = 0; +  } + +  /// Get the hints associated with the query. +  const boost::asio::detail::addrinfo_type& hints() const +  { +    return hints_; +  } + +  /// Get the host name associated with the query. +  std::string host_name() const +  { +    return host_name_; +  } + +  /// Get the service name associated with the query. +  std::string service_name() const +  { +    return service_name_; +  } + +private: +  boost::asio::detail::addrinfo_type hints_; +  std::string host_name_; +  std::string service_name_; +}; + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_BASIC_RESOLVER_QUERY_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/detail/socket_option.hpp b/3rdParty/Boost/src/boost/asio/ip/detail/socket_option.hpp new file mode 100644 index 0000000..40226fe --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/detail/socket_option.hpp @@ -0,0 +1,580 @@ +// +// socket_option.hpp +// ~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_DETAIL_SOCKET_OPTION_HPP +#define BOOST_ASIO_IP_DETAIL_SOCKET_OPTION_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <cstddef> +#include <cstring> +#include <boost/config.hpp> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/ip/address.hpp> +#include <boost/asio/detail/socket_ops.hpp> +#include <boost/asio/detail/socket_types.hpp> + +namespace boost { +namespace asio { +namespace ip { +namespace detail { +namespace socket_option { + +// Helper template for implementing multicast enable loopback options. +template <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name> +class multicast_enable_loopback +{ +public: +#if defined(__sun) || defined(__osf__) +  typedef unsigned char ipv4_value_type; +  typedef unsigned char ipv6_value_type; +#elif defined(_AIX) || defined(__hpux) || defined(__QNXNTO__)  +  typedef unsigned char ipv4_value_type; +  typedef unsigned int ipv6_value_type; +#else +  typedef int ipv4_value_type; +  typedef int ipv6_value_type; +#endif + +  // Default constructor. +  multicast_enable_loopback() +    : ipv4_value_(0), +      ipv6_value_(0) +  { +  } + +  // Construct with a specific option value. +  explicit multicast_enable_loopback(bool v) +    : ipv4_value_(v ? 1 : 0), +      ipv6_value_(v ? 1 : 0) +  { +  } + +  // Set the value of the boolean. +  multicast_enable_loopback& operator=(bool v) +  { +    ipv4_value_ = v ? 1 : 0; +    ipv6_value_ = v ? 1 : 0; +    return *this; +  } + +  // Get the current value of the boolean. +  bool value() const +  { +    return !!ipv4_value_; +  } + +  // Convert to bool. +  operator bool() const +  { +    return !!ipv4_value_; +  } + +  // Test for false. +  bool operator!() const +  { +    return !ipv4_value_; +  } + +  // Get the level of the socket option. +  template <typename Protocol> +  int level(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return IPv6_Level; +    return IPv4_Level; +  } + +  // Get the name of the socket option. +  template <typename Protocol> +  int name(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return IPv6_Name; +    return IPv4_Name; +  } + +  // Get the address of the boolean data. +  template <typename Protocol> +  void* data(const Protocol& protocol) +  { +    if (protocol.family() == PF_INET6) +      return &ipv6_value_; +    return &ipv4_value_; +  } + +  // Get the address of the boolean data. +  template <typename Protocol> +  const void* data(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return &ipv6_value_; +    return &ipv4_value_; +  } + +  // Get the size of the boolean data. +  template <typename Protocol> +  std::size_t size(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return sizeof(ipv6_value_); +    return sizeof(ipv4_value_); +  } + +  // Set the size of the boolean data. +  template <typename Protocol> +  void resize(const Protocol& protocol, std::size_t s) +  { +    if (protocol.family() == PF_INET6) +    { +      if (s != sizeof(ipv6_value_)) +      { +        throw std::length_error( +            "multicast_enable_loopback socket option resize"); +      } +      ipv4_value_ = ipv6_value_ ? 1 : 0; +    } +    else +    { +      if (s != sizeof(ipv4_value_)) +      { +        throw std::length_error( +            "multicast_enable_loopback socket option resize"); +      } +      ipv6_value_ = ipv4_value_ ? 1 : 0; +    } +  } + +private: +  ipv4_value_type ipv4_value_; +  ipv6_value_type ipv6_value_; +}; + +// Helper template for implementing unicast hops options. +template <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name> +class unicast_hops +{ +public: +  // Default constructor. +  unicast_hops() +    : value_(0) +  { +  } + +  // Construct with a specific option value. +  explicit unicast_hops(int v) +    : value_(v) +  { +  } + +  // Set the value of the option. +  unicast_hops& operator=(int v) +  { +    value_ = v; +    return *this; +  } + +  // Get the current value of the option. +  int value() const +  { +    return value_; +  } + +  // Get the level of the socket option. +  template <typename Protocol> +  int level(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return IPv6_Level; +    return IPv4_Level; +  } + +  // Get the name of the socket option. +  template <typename Protocol> +  int name(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return IPv6_Name; +    return IPv4_Name; +  } + +  // Get the address of the data. +  template <typename Protocol> +  int* data(const Protocol&) +  { +    return &value_; +  } + +  // Get the address of the data. +  template <typename Protocol> +  const int* data(const Protocol&) const +  { +    return &value_; +  } + +  // Get the size of the data. +  template <typename Protocol> +  std::size_t size(const Protocol&) const +  { +    return sizeof(value_); +  } + +  // Set the size of the data. +  template <typename Protocol> +  void resize(const Protocol&, std::size_t s) +  { +    if (s != sizeof(value_)) +      throw std::length_error("unicast hops socket option resize"); +#if defined(__hpux) +    if (value_ < 0) +      value_ = value_ & 0xFF; +#endif +  } + +private: +  int value_; +}; + +// Helper template for implementing multicast hops options. +template <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name> +class multicast_hops +{ +public: +#if defined(BOOST_WINDOWS) && defined(UNDER_CE) +  typedef int ipv4_value_type; +#else +  typedef unsigned char ipv4_value_type; +#endif +  typedef int ipv6_value_type; + +  // Default constructor. +  multicast_hops() +    : ipv4_value_(0), +      ipv6_value_(0) +  { +  } + +  // Construct with a specific option value. +  explicit multicast_hops(int v) +  { +    if (v < 0 || v > 255) +      throw std::out_of_range("multicast hops value out of range"); +    ipv4_value_ = (ipv4_value_type)v; +    ipv6_value_ = v; +  } + +  // Set the value of the option. +  multicast_hops& operator=(int v) +  { +    if (v < 0 || v > 255) +      throw std::out_of_range("multicast hops value out of range"); +    ipv4_value_ = (ipv4_value_type)v; +    ipv6_value_ = v; +    return *this; +  } + +  // Get the current value of the option. +  int value() const +  { +    return ipv6_value_; +  } + +  // Get the level of the socket option. +  template <typename Protocol> +  int level(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return IPv6_Level; +    return IPv4_Level; +  } + +  // Get the name of the socket option. +  template <typename Protocol> +  int name(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return IPv6_Name; +    return IPv4_Name; +  } + +  // Get the address of the data. +  template <typename Protocol> +  void* data(const Protocol& protocol) +  { +    if (protocol.family() == PF_INET6) +      return &ipv6_value_; +    return &ipv4_value_; +  } + +  // Get the address of the data. +  template <typename Protocol> +  const void* data(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return &ipv6_value_; +    return &ipv4_value_; +  } + +  // Get the size of the data. +  template <typename Protocol> +  std::size_t size(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return sizeof(ipv6_value_); +    return sizeof(ipv4_value_); +  } + +  // Set the size of the data. +  template <typename Protocol> +  void resize(const Protocol& protocol, std::size_t s) +  { +    if (protocol.family() == PF_INET6) +    { +      if (s != sizeof(ipv6_value_)) +        throw std::length_error("multicast hops socket option resize"); +      if (ipv6_value_ < 0) +        ipv4_value_ = 0; +      else if (ipv6_value_ > 255) +        ipv4_value_ = 255; +      else +        ipv4_value_ = (ipv4_value_type)ipv6_value_; +    } +    else +    { +      if (s != sizeof(ipv4_value_)) +        throw std::length_error("multicast hops socket option resize"); +      ipv6_value_ = ipv4_value_; +    } +  } + +private: +  ipv4_value_type ipv4_value_; +  ipv6_value_type ipv6_value_; +}; + +// Helper template for implementing ip_mreq-based options. +template <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name> +class multicast_request +{ +public: +  // Default constructor. +  multicast_request() +  { +    ipv4_value_.imr_multiaddr.s_addr = +      boost::asio::detail::socket_ops::host_to_network_long( +          boost::asio::ip::address_v4::any().to_ulong()); +    ipv4_value_.imr_interface.s_addr = +      boost::asio::detail::socket_ops::host_to_network_long( +          boost::asio::ip::address_v4::any().to_ulong()); + +    boost::asio::detail::in6_addr_type tmp_addr = IN6ADDR_ANY_INIT; +    ipv6_value_.ipv6mr_multiaddr = tmp_addr; +    ipv6_value_.ipv6mr_interface = 0; +  } + +  // Construct with multicast address only. +  explicit multicast_request(const boost::asio::ip::address& multicast_address) +  { +    if (multicast_address.is_v6()) +    { +      ipv4_value_.imr_multiaddr.s_addr = +        boost::asio::detail::socket_ops::host_to_network_long( +            boost::asio::ip::address_v4::any().to_ulong()); +      ipv4_value_.imr_interface.s_addr = +        boost::asio::detail::socket_ops::host_to_network_long( +            boost::asio::ip::address_v4::any().to_ulong()); + +      using namespace std; // For memcpy. +      boost::asio::ip::address_v6 ipv6_address = multicast_address.to_v6(); +      boost::asio::ip::address_v6::bytes_type bytes = ipv6_address.to_bytes(); +      memcpy(ipv6_value_.ipv6mr_multiaddr.s6_addr, bytes.elems, 16); +      ipv6_value_.ipv6mr_interface = 0; +    } +    else +    { +      ipv4_value_.imr_multiaddr.s_addr = +        boost::asio::detail::socket_ops::host_to_network_long( +            multicast_address.to_v4().to_ulong()); +      ipv4_value_.imr_interface.s_addr = +        boost::asio::detail::socket_ops::host_to_network_long( +            boost::asio::ip::address_v4::any().to_ulong()); + +      boost::asio::detail::in6_addr_type tmp_addr = IN6ADDR_ANY_INIT; +      ipv6_value_.ipv6mr_multiaddr = tmp_addr; +      ipv6_value_.ipv6mr_interface = 0; +    } +  } + +  // Construct with multicast address and IPv4 address specifying an interface. +  explicit multicast_request( +      const boost::asio::ip::address_v4& multicast_address, +      const boost::asio::ip::address_v4& network_interface +        = boost::asio::ip::address_v4::any()) +  { +    ipv4_value_.imr_multiaddr.s_addr = +      boost::asio::detail::socket_ops::host_to_network_long( +          multicast_address.to_ulong()); +    ipv4_value_.imr_interface.s_addr = +      boost::asio::detail::socket_ops::host_to_network_long( +          network_interface.to_ulong()); + +    boost::asio::detail::in6_addr_type tmp_addr = IN6ADDR_ANY_INIT; +    ipv6_value_.ipv6mr_multiaddr = tmp_addr; +    ipv6_value_.ipv6mr_interface = 0; +  } + +  // Construct with multicast address and IPv6 network interface index. +  explicit multicast_request( +      const boost::asio::ip::address_v6& multicast_address, +      unsigned long network_interface = 0) +  { +    ipv4_value_.imr_multiaddr.s_addr = +      boost::asio::detail::socket_ops::host_to_network_long( +          boost::asio::ip::address_v4::any().to_ulong()); +    ipv4_value_.imr_interface.s_addr = +      boost::asio::detail::socket_ops::host_to_network_long( +          boost::asio::ip::address_v4::any().to_ulong()); + +    using namespace std; // For memcpy. +    boost::asio::ip::address_v6::bytes_type bytes = +      multicast_address.to_bytes(); +    memcpy(ipv6_value_.ipv6mr_multiaddr.s6_addr, bytes.elems, 16); +    ipv6_value_.ipv6mr_interface = network_interface; +  } + +  // Get the level of the socket option. +  template <typename Protocol> +  int level(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return IPv6_Level; +    return IPv4_Level; +  } + +  // Get the name of the socket option. +  template <typename Protocol> +  int name(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return IPv6_Name; +    return IPv4_Name; +  } + +  // Get the address of the option data. +  template <typename Protocol> +  const void* data(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return &ipv6_value_; +    return &ipv4_value_; +  } + +  // Get the size of the option data. +  template <typename Protocol> +  std::size_t size(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return sizeof(ipv6_value_); +    return sizeof(ipv4_value_); +  } + +private: +  boost::asio::detail::in4_mreq_type ipv4_value_; +  boost::asio::detail::in6_mreq_type ipv6_value_; +}; + +// Helper template for implementing options that specify a network interface. +template <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name> +class network_interface +{ +public: +  // Default constructor. +  network_interface() +  { +    ipv4_value_.s_addr = +      boost::asio::detail::socket_ops::host_to_network_long( +          boost::asio::ip::address_v4::any().to_ulong()); +    ipv6_value_ = 0; +  } + +  // Construct with IPv4 interface. +  explicit network_interface(const boost::asio::ip::address_v4& ipv4_interface) +  { +    ipv4_value_.s_addr = +      boost::asio::detail::socket_ops::host_to_network_long( +          ipv4_interface.to_ulong()); +    ipv6_value_ = 0; +  } + +  // Construct with IPv6 interface. +  explicit network_interface(unsigned int ipv6_interface) +  { +    ipv4_value_.s_addr = +      boost::asio::detail::socket_ops::host_to_network_long( +          boost::asio::ip::address_v4::any().to_ulong()); +    ipv6_value_ = ipv6_interface; +  } + +  // Get the level of the socket option. +  template <typename Protocol> +  int level(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return IPv6_Level; +    return IPv4_Level; +  } + +  // Get the name of the socket option. +  template <typename Protocol> +  int name(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return IPv6_Name; +    return IPv4_Name; +  } + +  // Get the address of the option data. +  template <typename Protocol> +  const void* data(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return &ipv6_value_; +    return &ipv4_value_; +  } + +  // Get the size of the option data. +  template <typename Protocol> +  std::size_t size(const Protocol& protocol) const +  { +    if (protocol.family() == PF_INET6) +      return sizeof(ipv6_value_); +    return sizeof(ipv4_value_); +  } + +private: +  boost::asio::detail::in4_addr_type ipv4_value_; +  unsigned int ipv6_value_; +}; + +} // namespace socket_option +} // namespace detail +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_DETAIL_SOCKET_OPTION_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/host_name.hpp b/3rdParty/Boost/src/boost/asio/ip/host_name.hpp new file mode 100644 index 0000000..a21950e --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/host_name.hpp @@ -0,0 +1,64 @@ +// +// host_name.hpp +// ~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_HOST_NAME_HPP +#define BOOST_ASIO_IP_HOST_NAME_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <string> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/error.hpp> +#include <boost/asio/detail/socket_ops.hpp> +#include <boost/asio/detail/throw_error.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Get the current host name. +std::string host_name(); + +/// Get the current host name. +std::string host_name(boost::system::error_code& ec); + +inline std::string host_name() +{ +  char name[1024]; +  boost::system::error_code ec; +  if (boost::asio::detail::socket_ops::gethostname(name, sizeof(name), ec) != 0) +  { +    boost::asio::detail::throw_error(ec); +    return std::string(); +  } +  return std::string(name); +} + +inline std::string host_name(boost::system::error_code& ec) +{ +  char name[1024]; +  if (boost::asio::detail::socket_ops::gethostname(name, sizeof(name), ec) != 0) +    return std::string(); +  return std::string(name); +} + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_HOST_NAME_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/icmp.hpp b/3rdParty/Boost/src/boost/asio/ip/icmp.hpp new file mode 100644 index 0000000..1230128 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/icmp.hpp @@ -0,0 +1,120 @@ +// +// icmp.hpp +// ~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_ICMP_HPP +#define BOOST_ASIO_IP_ICMP_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/basic_raw_socket.hpp> +#include <boost/asio/ip/basic_endpoint.hpp> +#include <boost/asio/ip/basic_resolver.hpp> +#include <boost/asio/ip/basic_resolver_iterator.hpp> +#include <boost/asio/ip/basic_resolver_query.hpp> +#include <boost/asio/detail/socket_types.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Encapsulates the flags needed for ICMP. +/** + * The boost::asio::ip::icmp class contains flags necessary for ICMP sockets. + * + * @par Thread Safety + * @e Distinct @e objects: Safe.@n + * @e Shared @e objects: Safe. + * + * @par Concepts: + * Protocol, InternetProtocol. + */ +class icmp +{ +public: +  /// The type of a ICMP endpoint. +  typedef basic_endpoint<icmp> endpoint; + +  /// The type of a resolver query. +  typedef basic_resolver_query<icmp> resolver_query; + +  /// The type of a resolver iterator. +  typedef basic_resolver_iterator<icmp> resolver_iterator; + +  /// Construct to represent the IPv4 ICMP protocol. +  static icmp v4() +  { +    return icmp(IPPROTO_ICMP, PF_INET); +  } + +  /// Construct to represent the IPv6 ICMP protocol. +  static icmp v6() +  { +    return icmp(IPPROTO_ICMPV6, PF_INET6); +  } + +  /// Obtain an identifier for the type of the protocol. +  int type() const +  { +    return SOCK_RAW; +  } + +  /// Obtain an identifier for the protocol. +  int protocol() const +  { +    return protocol_; +  } + +  /// Obtain an identifier for the protocol family. +  int family() const +  { +    return family_; +  } + +  /// The ICMP socket type. +  typedef basic_raw_socket<icmp> socket; + +  /// The ICMP resolver type. +  typedef basic_resolver<icmp> resolver; + +  /// Compare two protocols for equality. +  friend bool operator==(const icmp& p1, const icmp& p2) +  { +    return p1.protocol_ == p2.protocol_ && p1.family_ == p2.family_; +  } + +  /// Compare two protocols for inequality. +  friend bool operator!=(const icmp& p1, const icmp& p2) +  { +    return p1.protocol_ != p2.protocol_ || p1.family_ != p2.family_; +  } + +private: +  // Construct with a specific family. +  explicit icmp(int protocol, int family) +    : protocol_(protocol), +      family_(family) +  { +  } + +  int protocol_; +  int family_; +}; + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_ICMP_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/multicast.hpp b/3rdParty/Boost/src/boost/asio/ip/multicast.hpp new file mode 100644 index 0000000..0f151cd --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/multicast.hpp @@ -0,0 +1,183 @@ +// +// multicast.hpp +// ~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_MULTICAST_HPP +#define BOOST_ASIO_IP_MULTICAST_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <cstddef> +#include <boost/config.hpp> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/ip/detail/socket_option.hpp> + +namespace boost { +namespace asio { +namespace ip { +namespace multicast { + +/// Socket option to join a multicast group on a specified interface. +/** + * Implements the IPPROTO_IP/IP_ADD_MEMBERSHIP socket option. + * + * @par Examples + * Setting the option to join a multicast group: + * @code + * boost::asio::ip::udp::socket socket(io_service);  + * ... + * boost::asio::ip::address multicast_address = + *   boost::asio::ip::address::from_string("225.0.0.1"); + * boost::asio::ip::multicast::join_group option(multicast_address); + * socket.set_option(option); + * @endcode + * + * @par Concepts: + * SettableSocketOption. + */ +#if defined(GENERATING_DOCUMENTATION) +typedef implementation_defined join_group; +#else +typedef boost::asio::ip::detail::socket_option::multicast_request< +  IPPROTO_IP, IP_ADD_MEMBERSHIP, IPPROTO_IPV6, IPV6_JOIN_GROUP> join_group; +#endif + +/// Socket option to leave a multicast group on a specified interface. +/** + * Implements the IPPROTO_IP/IP_DROP_MEMBERSHIP socket option. + * + * @par Examples + * Setting the option to leave a multicast group: + * @code + * boost::asio::ip::udp::socket socket(io_service);  + * ... + * boost::asio::ip::address multicast_address = + *   boost::asio::ip::address::from_string("225.0.0.1"); + * boost::asio::ip::multicast::leave_group option(multicast_address); + * socket.set_option(option); + * @endcode + * + * @par Concepts: + * SettableSocketOption. + */ +#if defined(GENERATING_DOCUMENTATION) +typedef implementation_defined leave_group; +#else +typedef boost::asio::ip::detail::socket_option::multicast_request< +  IPPROTO_IP, IP_DROP_MEMBERSHIP, IPPROTO_IPV6, IPV6_LEAVE_GROUP> leave_group; +#endif + +/// Socket option for local interface to use for outgoing multicast packets. +/** + * Implements the IPPROTO_IP/IP_MULTICAST_IF socket option. + * + * @par Examples + * Setting the option: + * @code + * boost::asio::ip::udp::socket socket(io_service);  + * ... + * boost::asio::ip::address_v4 local_interface = + *   boost::asio::ip::address_v4::from_string("1.2.3.4"); + * boost::asio::ip::multicast::outbound_interface option(local_interface); + * socket.set_option(option); + * @endcode + * + * @par Concepts: + * SettableSocketOption. + */ +#if defined(GENERATING_DOCUMENTATION) +typedef implementation_defined outbound_interface; +#else +typedef boost::asio::ip::detail::socket_option::network_interface< +  IPPROTO_IP, IP_MULTICAST_IF, IPPROTO_IPV6, IPV6_MULTICAST_IF> +  outbound_interface; +#endif + +/// Socket option for time-to-live associated with outgoing multicast packets. +/** + * Implements the IPPROTO_IP/IP_MULTICAST_TTL socket option. + * + * @par Examples + * Setting the option: + * @code + * boost::asio::ip::udp::socket socket(io_service);  + * ... + * boost::asio::ip::multicast::hops option(4); + * socket.set_option(option); + * @endcode + * + * @par + * Getting the current option value: + * @code + * boost::asio::ip::udp::socket socket(io_service);  + * ... + * boost::asio::ip::multicast::hops option; + * socket.get_option(option); + * int ttl = option.value(); + * @endcode + * + * @par Concepts: + * GettableSocketOption, SettableSocketOption. + */ +#if defined(GENERATING_DOCUMENTATION) +typedef implementation_defined hops; +#else +typedef boost::asio::ip::detail::socket_option::multicast_hops< +  IPPROTO_IP, IP_MULTICAST_TTL, IPPROTO_IPV6, IPV6_MULTICAST_HOPS> hops; +#endif + +/// Socket option determining whether outgoing multicast packets will be +/// received on the same socket if it is a member of the multicast group. +/** + * Implements the IPPROTO_IP/IP_MULTICAST_LOOP socket option. + * + * @par Examples + * Setting the option: + * @code + * boost::asio::ip::udp::socket socket(io_service);  + * ... + * boost::asio::ip::multicast::enable_loopback option(true); + * socket.set_option(option); + * @endcode + * + * @par + * Getting the current option value: + * @code + * boost::asio::ip::udp::socket socket(io_service);  + * ... + * boost::asio::ip::multicast::enable_loopback option; + * socket.get_option(option); + * bool is_set = option.value(); + * @endcode + * + * @par Concepts: + * GettableSocketOption, SettableSocketOption. + */ +#if defined(GENERATING_DOCUMENTATION) +typedef implementation_defined enable_loopback; +#else +typedef boost::asio::ip::detail::socket_option::multicast_enable_loopback< +  IPPROTO_IP, IP_MULTICAST_LOOP, IPPROTO_IPV6, IPV6_MULTICAST_LOOP> +  enable_loopback; +#endif + +} // namespace multicast +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_MULTICAST_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/resolver_query_base.hpp b/3rdParty/Boost/src/boost/asio/ip/resolver_query_base.hpp new file mode 100644 index 0000000..67b5c80 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/resolver_query_base.hpp @@ -0,0 +1,111 @@ +// +// resolver_query_base.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_RESOLVER_QUERY_BASE_HPP +#define BOOST_ASIO_IP_RESOLVER_QUERY_BASE_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <boost/config.hpp> +#include <boost/detail/workaround.hpp> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/detail/socket_types.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// The resolver_query_base class is used as a base for the +/// basic_resolver_query class templates to provide a common place to define +/// the flag constants. +class resolver_query_base +{ +public: +#if defined(GENERATING_DOCUMENTATION) +  /// Determine the canonical name of the host specified in the query. +  static const int canonical_name = implementation_defined; + +  /// Indicate that returned endpoint is intended for use as a locally bound +  /// socket endpoint. +  static const int passive = implementation_defined; + +  /// Host name should be treated as a numeric string defining an IPv4 or IPv6 +  /// address and no name resolution should be attempted. +  static const int numeric_host = implementation_defined; + +  /// Service name should be treated as a numeric string defining a port number +  /// and no name resolution should be attempted. +  static const int numeric_service = implementation_defined; + +  /// If the query protocol family is specified as IPv6, return IPv4-mapped +  /// IPv6 addresses on finding no IPv6 addresses. +  static const int v4_mapped = implementation_defined; + +  /// If used with v4_mapped, return all matching IPv6 and IPv4 addresses. +  static const int all_matching = implementation_defined; + +  /// Only return IPv4 addresses if a non-loopback IPv4 address is configured +  /// for the system. Only return IPv6 addresses if a non-loopback IPv6 address +  /// is configured for the system. +  static const int address_configured = implementation_defined; +#else +  BOOST_STATIC_CONSTANT(int, canonical_name = AI_CANONNAME); +  BOOST_STATIC_CONSTANT(int, passive = AI_PASSIVE); +  BOOST_STATIC_CONSTANT(int, numeric_host = AI_NUMERICHOST); +# if defined(AI_NUMERICSERV) +  BOOST_STATIC_CONSTANT(int, numeric_service = AI_NUMERICSERV); +# else +  BOOST_STATIC_CONSTANT(int, numeric_service = 0); +# endif +  // Note: QNX Neutrino 6.3 defines AI_V4MAPPED, AI_ALL and AI_ADDRCONFIG but +  // does not implement them. Therefore they are specifically excluded here. +# if defined(AI_V4MAPPED) && !defined(__QNXNTO__) +  BOOST_STATIC_CONSTANT(int, v4_mapped = AI_V4MAPPED); +# else +  BOOST_STATIC_CONSTANT(int, v4_mapped = 0); +# endif +# if defined(AI_ALL) && !defined(__QNXNTO__) +  BOOST_STATIC_CONSTANT(int, all_matching = AI_ALL); +# else +  BOOST_STATIC_CONSTANT(int, all_matching = 0); +# endif +# if defined(AI_ADDRCONFIG) && !defined(__QNXNTO__) +  BOOST_STATIC_CONSTANT(int, address_configured = AI_ADDRCONFIG); +# else +  BOOST_STATIC_CONSTANT(int, address_configured = 0); +# endif +#endif + +protected: +  /// Protected destructor to prevent deletion through this type. +  ~resolver_query_base() +  { +  } + +#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) +private: +  // Workaround to enable the empty base optimisation with Borland C++. +  char dummy_; +#endif +}; + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_RESOLVER_QUERY_BASE_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/resolver_service.hpp b/3rdParty/Boost/src/boost/asio/ip/resolver_service.hpp new file mode 100644 index 0000000..17a9ac1 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/resolver_service.hpp @@ -0,0 +1,142 @@ +// +// resolver_service.hpp +// ~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_RESOLVER_SERVICE_HPP +#define BOOST_ASIO_IP_RESOLVER_SERVICE_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/error.hpp> +#include <boost/asio/io_service.hpp> +#include <boost/asio/detail/resolver_service.hpp> +#include <boost/asio/detail/service_base.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Default service implementation for a resolver. +template <typename InternetProtocol> +class resolver_service +#if defined(GENERATING_DOCUMENTATION) +  : public boost::asio::io_service::service +#else +  : public boost::asio::detail::service_base< +      resolver_service<InternetProtocol> > +#endif +{ +public: +#if defined(GENERATING_DOCUMENTATION) +  /// The unique service identifier. +  static boost::asio::io_service::id id; +#endif + +  /// The protocol type. +  typedef InternetProtocol protocol_type; + +  /// The endpoint type. +  typedef typename InternetProtocol::endpoint endpoint_type; + +  /// The query type. +  typedef typename InternetProtocol::resolver_query query_type; + +  /// The iterator type. +  typedef typename InternetProtocol::resolver_iterator iterator_type; + +private: +  // The type of the platform-specific implementation. +  typedef boost::asio::detail::resolver_service<InternetProtocol> +    service_impl_type; + +public: +  /// The type of a resolver implementation. +#if defined(GENERATING_DOCUMENTATION) +  typedef implementation_defined implementation_type; +#else +  typedef typename service_impl_type::implementation_type implementation_type; +#endif + +  /// Construct a new resolver service for the specified io_service. +  explicit resolver_service(boost::asio::io_service& io_service) +    : boost::asio::detail::service_base< +        resolver_service<InternetProtocol> >(io_service), +      service_impl_(boost::asio::use_service<service_impl_type>(io_service)) +  { +  } + +  /// Destroy all user-defined handler objects owned by the service. +  void shutdown_service() +  { +  } + +  /// Construct a new resolver implementation. +  void construct(implementation_type& impl) +  { +    service_impl_.construct(impl); +  } + +  /// Destroy a resolver implementation. +  void destroy(implementation_type& impl) +  { +    service_impl_.destroy(impl); +  } + +  /// Cancel pending asynchronous operations. +  void cancel(implementation_type& impl) +  { +    service_impl_.cancel(impl); +  } + +  /// Resolve a query to a list of entries. +  iterator_type resolve(implementation_type& impl, const query_type& query, +      boost::system::error_code& ec) +  { +    return service_impl_.resolve(impl, query, ec); +  } + +  /// Asynchronously resolve a query to a list of entries. +  template <typename Handler> +  void async_resolve(implementation_type& impl, const query_type& query, +      Handler handler) +  { +    service_impl_.async_resolve(impl, query, handler); +  } + +  /// Resolve an endpoint to a list of entries. +  iterator_type resolve(implementation_type& impl, +      const endpoint_type& endpoint, boost::system::error_code& ec) +  { +    return service_impl_.resolve(impl, endpoint, ec); +  } + +  /// Asynchronously resolve an endpoint to a list of entries. +  template <typename ResolveHandler> +  void async_resolve(implementation_type& impl, const endpoint_type& endpoint, +      ResolveHandler handler) +  { +    return service_impl_.async_resolve(impl, endpoint, handler); +  } + +private: +  // The service that provides the platform-specific implementation. +  service_impl_type& service_impl_; +}; + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_RESOLVER_SERVICE_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/tcp.hpp b/3rdParty/Boost/src/boost/asio/ip/tcp.hpp new file mode 100644 index 0000000..4c282ab --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/tcp.hpp @@ -0,0 +1,160 @@ +// +// tcp.hpp +// ~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_TCP_HPP +#define BOOST_ASIO_IP_TCP_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/basic_socket_acceptor.hpp> +#include <boost/asio/basic_socket_iostream.hpp> +#include <boost/asio/basic_stream_socket.hpp> +#include <boost/asio/ip/basic_endpoint.hpp> +#include <boost/asio/ip/basic_resolver.hpp> +#include <boost/asio/ip/basic_resolver_iterator.hpp> +#include <boost/asio/ip/basic_resolver_query.hpp> +#include <boost/asio/detail/socket_option.hpp> +#include <boost/asio/detail/socket_types.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Encapsulates the flags needed for TCP. +/** + * The boost::asio::ip::tcp class contains flags necessary for TCP sockets. + * + * @par Thread Safety + * @e Distinct @e objects: Safe.@n + * @e Shared @e objects: Safe. + * + * @par Concepts: + * Protocol, InternetProtocol. + */ +class tcp +{ +public: +  /// The type of a TCP endpoint. +  typedef basic_endpoint<tcp> endpoint; + +  /// The type of a resolver query. +  typedef basic_resolver_query<tcp> resolver_query; + +  /// The type of a resolver iterator. +  typedef basic_resolver_iterator<tcp> resolver_iterator; + +  /// Construct to represent the IPv4 TCP protocol. +  static tcp v4() +  { +    return tcp(PF_INET); +  } + +  /// Construct to represent the IPv6 TCP protocol. +  static tcp v6() +  { +    return tcp(PF_INET6); +  } + +  /// Obtain an identifier for the type of the protocol. +  int type() const +  { +    return SOCK_STREAM; +  } + +  /// Obtain an identifier for the protocol. +  int protocol() const +  { +    return IPPROTO_TCP; +  } + +  /// Obtain an identifier for the protocol family. +  int family() const +  { +    return family_; +  } + +  /// The TCP socket type. +  typedef basic_stream_socket<tcp> socket; + +  /// The TCP acceptor type. +  typedef basic_socket_acceptor<tcp> acceptor; + +  /// The TCP resolver type. +  typedef basic_resolver<tcp> resolver; + +  /// The TCP iostream type. +  typedef basic_socket_iostream<tcp> iostream; + +  /// Socket option for disabling the Nagle algorithm. +  /** +   * Implements the IPPROTO_TCP/TCP_NODELAY socket option. +   * +   * @par Examples +   * Setting the option: +   * @code +   * boost::asio::ip::tcp::socket socket(io_service);  +   * ... +   * boost::asio::ip::tcp::no_delay option(true); +   * socket.set_option(option); +   * @endcode +   * +   * @par +   * Getting the current option value: +   * @code +   * boost::asio::ip::tcp::socket socket(io_service);  +   * ... +   * boost::asio::ip::tcp::no_delay option; +   * socket.get_option(option); +   * bool is_set = option.value(); +   * @endcode +   * +   * @par Concepts: +   * Socket_Option, Boolean_Socket_Option. +   */ +#if defined(GENERATING_DOCUMENTATION) +  typedef implementation_defined no_delay; +#else +  typedef boost::asio::detail::socket_option::boolean< +    IPPROTO_TCP, TCP_NODELAY> no_delay; +#endif + +  /// Compare two protocols for equality. +  friend bool operator==(const tcp& p1, const tcp& p2) +  { +    return p1.family_ == p2.family_; +  } + +  /// Compare two protocols for inequality. +  friend bool operator!=(const tcp& p1, const tcp& p2) +  { +    return p1.family_ != p2.family_; +  } + +private: +  // Construct with a specific family. +  explicit tcp(int family) +    : family_(family) +  { +  } + +  int family_; +}; + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_TCP_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/udp.hpp b/3rdParty/Boost/src/boost/asio/ip/udp.hpp new file mode 100644 index 0000000..886cad8 --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/udp.hpp @@ -0,0 +1,118 @@ +// +// udp.hpp +// ~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_UDP_HPP +#define BOOST_ASIO_IP_UDP_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/basic_datagram_socket.hpp> +#include <boost/asio/ip/basic_endpoint.hpp> +#include <boost/asio/ip/basic_resolver.hpp> +#include <boost/asio/ip/basic_resolver_iterator.hpp> +#include <boost/asio/ip/basic_resolver_query.hpp> +#include <boost/asio/detail/socket_types.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Encapsulates the flags needed for UDP. +/** + * The boost::asio::ip::udp class contains flags necessary for UDP sockets. + * + * @par Thread Safety + * @e Distinct @e objects: Safe.@n + * @e Shared @e objects: Safe. + * + * @par Concepts: + * Protocol, InternetProtocol. + */ +class udp +{ +public: +  /// The type of a UDP endpoint. +  typedef basic_endpoint<udp> endpoint; + +  /// The type of a resolver query. +  typedef basic_resolver_query<udp> resolver_query; + +  /// The type of a resolver iterator. +  typedef basic_resolver_iterator<udp> resolver_iterator; + +  /// Construct to represent the IPv4 UDP protocol. +  static udp v4() +  { +    return udp(PF_INET); +  } + +  /// Construct to represent the IPv6 UDP protocol. +  static udp v6() +  { +    return udp(PF_INET6); +  } + +  /// Obtain an identifier for the type of the protocol. +  int type() const +  { +    return SOCK_DGRAM; +  } + +  /// Obtain an identifier for the protocol. +  int protocol() const +  { +    return IPPROTO_UDP; +  } + +  /// Obtain an identifier for the protocol family. +  int family() const +  { +    return family_; +  } + +  /// The UDP socket type. +  typedef basic_datagram_socket<udp> socket; + +  /// The UDP resolver type. +  typedef basic_resolver<udp> resolver; + +  /// Compare two protocols for equality. +  friend bool operator==(const udp& p1, const udp& p2) +  { +    return p1.family_ == p2.family_; +  } + +  /// Compare two protocols for inequality. +  friend bool operator!=(const udp& p1, const udp& p2) +  { +    return p1.family_ != p2.family_; +  } + +private: +  // Construct with a specific family. +  explicit udp(int family) +    : family_(family) +  { +  } + +  int family_; +}; + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_UDP_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/unicast.hpp b/3rdParty/Boost/src/boost/asio/ip/unicast.hpp new file mode 100644 index 0000000..f603fed --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/unicast.hpp @@ -0,0 +1,72 @@ +// +// unicast.hpp +// ~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_UNICAST_HPP +#define BOOST_ASIO_IP_UNICAST_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/push_options.hpp> +#include <cstddef> +#include <boost/config.hpp> +#include <boost/asio/detail/pop_options.hpp> + +#include <boost/asio/ip/detail/socket_option.hpp> + +namespace boost { +namespace asio { +namespace ip { +namespace unicast { + +/// Socket option for time-to-live associated with outgoing unicast packets. +/** + * Implements the IPPROTO_IP/IP_UNICAST_TTL socket option. + * + * @par Examples + * Setting the option: + * @code + * boost::asio::ip::udp::socket socket(io_service);  + * ... + * boost::asio::ip::unicast::hops option(4); + * socket.set_option(option); + * @endcode + * + * @par + * Getting the current option value: + * @code + * boost::asio::ip::udp::socket socket(io_service);  + * ... + * boost::asio::ip::unicast::hops option; + * socket.get_option(option); + * int ttl = option.value(); + * @endcode + * + * @par Concepts: + * GettableSocketOption, SettableSocketOption. + */ +#if defined(GENERATING_DOCUMENTATION) +typedef implementation_defined hops; +#else +typedef boost::asio::ip::detail::socket_option::unicast_hops< +  IPPROTO_IP, IP_TTL, IPPROTO_IPV6, IPV6_UNICAST_HOPS> hops; +#endif + +} // namespace unicast +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_UNICAST_HPP diff --git a/3rdParty/Boost/src/boost/asio/ip/v6_only.hpp b/3rdParty/Boost/src/boost/asio/ip/v6_only.hpp new file mode 100644 index 0000000..203776d --- /dev/null +++ b/3rdParty/Boost/src/boost/asio/ip/v6_only.hpp @@ -0,0 +1,70 @@ +// +// v6_only.hpp +// ~~~~~~~~~~~ +// +// Copyright (c) 2003-2008 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 BOOST_ASIO_IP_V6_ONLY_HPP +#define BOOST_ASIO_IP_V6_ONLY_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include <boost/asio/detail/push_options.hpp> + +#include <boost/asio/detail/socket_option.hpp> + +namespace boost { +namespace asio { +namespace ip { + +/// Socket option for determining whether an IPv6 socket supports IPv6 +/// communication only. +/** + * Implements the IPPROTO_IPV6/IP_V6ONLY socket option. + * + * @par Examples + * Setting the option: + * @code + * boost::asio::ip::tcp::socket socket(io_service);  + * ... + * boost::asio::ip::v6_only option(true); + * socket.set_option(option); + * @endcode + * + * @par + * Getting the current option value: + * @code + * boost::asio::ip::tcp::socket socket(io_service);  + * ... + * boost::asio::ip::v6_only option; + * socket.get_option(option); + * bool v6_only = option.value(); + * @endcode + * + * @par Concepts: + * GettableSocketOption, SettableSocketOption. + */ +#if defined(GENERATING_DOCUMENTATION) +typedef implementation_defined v6_only; +#elif defined(IPV6_V6ONLY) +typedef boost::asio::detail::socket_option::boolean< +    IPPROTO_IPV6, IPV6_V6ONLY> v6_only; +#else +typedef boost::asio::detail::socket_option::boolean< +    boost::asio::detail::custom_socket_option_level, +    boost::asio::detail::always_fail_option> v6_only; +#endif + +} // namespace ip +} // namespace asio +} // namespace boost + +#include <boost/asio/detail/pop_options.hpp> + +#endif // BOOST_ASIO_IP_V6_ONLY_HPP  | 
 Swift