Chris@16: // Chris@16: // ip/detail/impl/endpoint.ipp Chris@16: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Chris@16: // Chris@101: // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: Chris@16: #ifndef BOOST_ASIO_IP_DETAIL_IMPL_ENDPOINT_IPP Chris@16: #define BOOST_ASIO_IP_DETAIL_IMPL_ENDPOINT_IPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: Chris@16: #include Chris@16: #include Chris@16: #if !defined(BOOST_ASIO_NO_IOSTREAM) Chris@16: # include Chris@16: #endif // !defined(BOOST_ASIO_NO_IOSTREAM) Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace asio { Chris@16: namespace ip { Chris@16: namespace detail { Chris@16: Chris@16: endpoint::endpoint() Chris@16: : data_() Chris@16: { Chris@16: data_.v4.sin_family = BOOST_ASIO_OS_DEF(AF_INET); Chris@16: data_.v4.sin_port = 0; Chris@16: data_.v4.sin_addr.s_addr = BOOST_ASIO_OS_DEF(INADDR_ANY); Chris@16: } Chris@16: Chris@16: endpoint::endpoint(int family, unsigned short port_num) Chris@16: : data_() Chris@16: { Chris@16: using namespace std; // For memcpy. Chris@16: if (family == BOOST_ASIO_OS_DEF(AF_INET)) Chris@16: { Chris@16: data_.v4.sin_family = BOOST_ASIO_OS_DEF(AF_INET); Chris@16: data_.v4.sin_port = Chris@16: boost::asio::detail::socket_ops::host_to_network_short(port_num); Chris@16: data_.v4.sin_addr.s_addr = BOOST_ASIO_OS_DEF(INADDR_ANY); Chris@16: } Chris@16: else Chris@16: { Chris@16: data_.v6.sin6_family = BOOST_ASIO_OS_DEF(AF_INET6); Chris@16: data_.v6.sin6_port = Chris@16: boost::asio::detail::socket_ops::host_to_network_short(port_num); Chris@16: data_.v6.sin6_flowinfo = 0; Chris@16: data_.v6.sin6_addr.s6_addr[0] = 0; data_.v6.sin6_addr.s6_addr[1] = 0; Chris@16: data_.v6.sin6_addr.s6_addr[2] = 0, data_.v6.sin6_addr.s6_addr[3] = 0; Chris@16: data_.v6.sin6_addr.s6_addr[4] = 0, data_.v6.sin6_addr.s6_addr[5] = 0; Chris@16: data_.v6.sin6_addr.s6_addr[6] = 0, data_.v6.sin6_addr.s6_addr[7] = 0; Chris@16: data_.v6.sin6_addr.s6_addr[8] = 0, data_.v6.sin6_addr.s6_addr[9] = 0; Chris@16: data_.v6.sin6_addr.s6_addr[10] = 0, data_.v6.sin6_addr.s6_addr[11] = 0; Chris@16: data_.v6.sin6_addr.s6_addr[12] = 0, data_.v6.sin6_addr.s6_addr[13] = 0; Chris@16: data_.v6.sin6_addr.s6_addr[14] = 0, data_.v6.sin6_addr.s6_addr[15] = 0; Chris@16: data_.v6.sin6_scope_id = 0; Chris@16: } Chris@16: } Chris@16: Chris@16: endpoint::endpoint(const boost::asio::ip::address& addr, Chris@16: unsigned short port_num) Chris@16: : data_() Chris@16: { Chris@16: using namespace std; // For memcpy. Chris@16: if (addr.is_v4()) Chris@16: { Chris@16: data_.v4.sin_family = BOOST_ASIO_OS_DEF(AF_INET); Chris@16: data_.v4.sin_port = Chris@16: boost::asio::detail::socket_ops::host_to_network_short(port_num); Chris@16: data_.v4.sin_addr.s_addr = Chris@16: boost::asio::detail::socket_ops::host_to_network_long( Chris@16: static_cast( Chris@16: addr.to_v4().to_ulong())); Chris@16: } Chris@16: else Chris@16: { Chris@16: data_.v6.sin6_family = BOOST_ASIO_OS_DEF(AF_INET6); Chris@16: data_.v6.sin6_port = Chris@16: boost::asio::detail::socket_ops::host_to_network_short(port_num); Chris@16: data_.v6.sin6_flowinfo = 0; Chris@16: boost::asio::ip::address_v6 v6_addr = addr.to_v6(); Chris@16: boost::asio::ip::address_v6::bytes_type bytes = v6_addr.to_bytes(); Chris@16: memcpy(data_.v6.sin6_addr.s6_addr, bytes.data(), 16); Chris@16: data_.v6.sin6_scope_id = Chris@16: static_cast( Chris@16: v6_addr.scope_id()); Chris@16: } Chris@16: } Chris@16: Chris@16: void endpoint::resize(std::size_t new_size) Chris@16: { Chris@16: if (new_size > sizeof(boost::asio::detail::sockaddr_storage_type)) Chris@16: { Chris@16: boost::system::error_code ec(boost::asio::error::invalid_argument); Chris@16: boost::asio::detail::throw_error(ec); Chris@16: } Chris@16: } Chris@16: Chris@16: unsigned short endpoint::port() const Chris@16: { Chris@16: if (is_v4()) Chris@16: { Chris@16: return boost::asio::detail::socket_ops::network_to_host_short( Chris@16: data_.v4.sin_port); Chris@16: } Chris@16: else Chris@16: { Chris@16: return boost::asio::detail::socket_ops::network_to_host_short( Chris@16: data_.v6.sin6_port); Chris@16: } Chris@16: } Chris@16: Chris@16: void endpoint::port(unsigned short port_num) Chris@16: { Chris@16: if (is_v4()) Chris@16: { Chris@16: data_.v4.sin_port Chris@16: = boost::asio::detail::socket_ops::host_to_network_short(port_num); Chris@16: } Chris@16: else Chris@16: { Chris@16: data_.v6.sin6_port Chris@16: = boost::asio::detail::socket_ops::host_to_network_short(port_num); Chris@16: } Chris@16: } Chris@16: Chris@16: boost::asio::ip::address endpoint::address() const Chris@16: { Chris@16: using namespace std; // For memcpy. Chris@16: if (is_v4()) Chris@16: { Chris@16: return boost::asio::ip::address_v4( Chris@16: boost::asio::detail::socket_ops::network_to_host_long( Chris@16: data_.v4.sin_addr.s_addr)); Chris@16: } Chris@16: else Chris@16: { Chris@16: boost::asio::ip::address_v6::bytes_type bytes; Chris@16: #if defined(BOOST_ASIO_HAS_STD_ARRAY) Chris@16: memcpy(bytes.data(), data_.v6.sin6_addr.s6_addr, 16); Chris@16: #else // defined(BOOST_ASIO_HAS_STD_ARRAY) Chris@16: memcpy(bytes.elems, data_.v6.sin6_addr.s6_addr, 16); Chris@16: #endif // defined(BOOST_ASIO_HAS_STD_ARRAY) Chris@16: return boost::asio::ip::address_v6(bytes, data_.v6.sin6_scope_id); Chris@16: } Chris@16: } Chris@16: Chris@16: void endpoint::address(const boost::asio::ip::address& addr) Chris@16: { Chris@16: endpoint tmp_endpoint(addr, port()); Chris@16: data_ = tmp_endpoint.data_; Chris@16: } Chris@16: Chris@16: bool operator==(const endpoint& e1, const endpoint& e2) Chris@16: { Chris@16: return e1.address() == e2.address() && e1.port() == e2.port(); Chris@16: } Chris@16: Chris@16: bool operator<(const endpoint& e1, const endpoint& e2) Chris@16: { Chris@16: if (e1.address() < e2.address()) Chris@16: return true; Chris@16: if (e1.address() != e2.address()) Chris@16: return false; Chris@16: return e1.port() < e2.port(); Chris@16: } Chris@16: Chris@16: #if !defined(BOOST_ASIO_NO_IOSTREAM) Chris@16: std::string endpoint::to_string(boost::system::error_code& ec) const Chris@16: { Chris@16: std::string a = address().to_string(ec); Chris@16: if (ec) Chris@16: return std::string(); Chris@16: Chris@16: std::ostringstream tmp_os; Chris@16: tmp_os.imbue(std::locale::classic()); Chris@16: if (is_v4()) Chris@16: tmp_os << a; Chris@16: else Chris@16: tmp_os << '[' << a << ']'; Chris@16: tmp_os << ':' << port(); Chris@16: Chris@16: return tmp_os.str(); Chris@16: } Chris@16: #endif // !defined(BOOST_ASIO_NO_IOSTREAM) Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace ip Chris@16: } // namespace asio Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_ASIO_IP_DETAIL_IMPL_ENDPOINT_IPP