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