1 // 2 // ip/tcp.hpp 3 // ~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 #ifndef BOOST_ASIO_IP_TCP_HPP 12 #define BOOST_ASIO_IP_TCP_HPP 13 14 #if defined(_MSC_VER) && (_MSC_VER >= 1200) 15 # pragma once 16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) 17 18 #include <boost/asio/detail/config.hpp> 19 #include <boost/asio/basic_socket_acceptor.hpp> 20 #include <boost/asio/basic_socket_iostream.hpp> 21 #include <boost/asio/basic_stream_socket.hpp> 22 #include <boost/asio/detail/socket_option.hpp> 23 #include <boost/asio/detail/socket_types.hpp> 24 #include <boost/asio/ip/basic_endpoint.hpp> 25 #include <boost/asio/ip/basic_resolver.hpp> 26 #include <boost/asio/ip/basic_resolver_iterator.hpp> 27 #include <boost/asio/ip/basic_resolver_query.hpp> 28 29 #include <boost/asio/detail/push_options.hpp> 30 31 namespace boost { 32 namespace asio { 33 namespace ip { 34 35 /// Encapsulates the flags needed for TCP. 36 /** 37 * The boost::asio::ip::tcp class contains flags necessary for TCP sockets. 38 * 39 * @par Thread Safety 40 * @e Distinct @e objects: Safe.@n 41 * @e Shared @e objects: Safe. 42 * 43 * @par Concepts: 44 * Protocol, InternetProtocol. 45 */ 46 class tcp 47 { 48 public: 49 /// The type of a TCP endpoint. 50 typedef basic_endpoint<tcp> endpoint; 51 52 /// Construct to represent the IPv4 TCP protocol. v4()53 static tcp v4() BOOST_ASIO_NOEXCEPT 54 { 55 return tcp(BOOST_ASIO_OS_DEF(AF_INET)); 56 } 57 58 /// Construct to represent the IPv6 TCP protocol. v6()59 static tcp v6() BOOST_ASIO_NOEXCEPT 60 { 61 return tcp(BOOST_ASIO_OS_DEF(AF_INET6)); 62 } 63 64 /// Obtain an identifier for the type of the protocol. type() const65 int type() const BOOST_ASIO_NOEXCEPT 66 { 67 return BOOST_ASIO_OS_DEF(SOCK_STREAM); 68 } 69 70 /// Obtain an identifier for the protocol. protocol() const71 int protocol() const BOOST_ASIO_NOEXCEPT 72 { 73 return BOOST_ASIO_OS_DEF(IPPROTO_TCP); 74 } 75 76 /// Obtain an identifier for the protocol family. family() const77 int family() const BOOST_ASIO_NOEXCEPT 78 { 79 return family_; 80 } 81 82 /// The TCP socket type. 83 typedef basic_stream_socket<tcp> socket; 84 85 /// The TCP acceptor type. 86 typedef basic_socket_acceptor<tcp> acceptor; 87 88 /// The TCP resolver type. 89 typedef basic_resolver<tcp> resolver; 90 91 #if !defined(BOOST_ASIO_NO_IOSTREAM) 92 /// The TCP iostream type. 93 typedef basic_socket_iostream<tcp> iostream; 94 #endif // !defined(BOOST_ASIO_NO_IOSTREAM) 95 96 /// Socket option for disabling the Nagle algorithm. 97 /** 98 * Implements the IPPROTO_TCP/TCP_NODELAY socket option. 99 * 100 * @par Examples 101 * Setting the option: 102 * @code 103 * boost::asio::ip::tcp::socket socket(my_context); 104 * ... 105 * boost::asio::ip::tcp::no_delay option(true); 106 * socket.set_option(option); 107 * @endcode 108 * 109 * @par 110 * Getting the current option value: 111 * @code 112 * boost::asio::ip::tcp::socket socket(my_context); 113 * ... 114 * boost::asio::ip::tcp::no_delay option; 115 * socket.get_option(option); 116 * bool is_set = option.value(); 117 * @endcode 118 * 119 * @par Concepts: 120 * Socket_Option, Boolean_Socket_Option. 121 */ 122 #if defined(GENERATING_DOCUMENTATION) 123 typedef implementation_defined no_delay; 124 #else 125 typedef boost::asio::detail::socket_option::boolean< 126 BOOST_ASIO_OS_DEF(IPPROTO_TCP), BOOST_ASIO_OS_DEF(TCP_NODELAY)> no_delay; 127 #endif 128 129 /// Compare two protocols for equality. operator ==(const tcp & p1,const tcp & p2)130 friend bool operator==(const tcp& p1, const tcp& p2) 131 { 132 return p1.family_ == p2.family_; 133 } 134 135 /// Compare two protocols for inequality. operator !=(const tcp & p1,const tcp & p2)136 friend bool operator!=(const tcp& p1, const tcp& p2) 137 { 138 return p1.family_ != p2.family_; 139 } 140 141 private: 142 // Construct with a specific family. tcp(int protocol_family)143 explicit tcp(int protocol_family) BOOST_ASIO_NOEXCEPT 144 : family_(protocol_family) 145 { 146 } 147 148 int family_; 149 }; 150 151 } // namespace ip 152 } // namespace asio 153 } // namespace boost 154 155 #include <boost/asio/detail/pop_options.hpp> 156 157 #endif // BOOST_ASIO_IP_TCP_HPP 158