1 // 2 // generic/stream_protocol.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_GENERIC_STREAM_PROTOCOL_HPP 12 #define ASIO_GENERIC_STREAM_PROTOCOL_HPP 13 14 15 #include "asio/detail/config.hpp" 16 17 #include <typeinfo> 18 #include "asio/basic_socket_iostream.hpp" 19 #include "asio/basic_stream_socket.hpp" 20 #include "asio/detail/socket_types.hpp" 21 #include "asio/detail/throw_exception.hpp" 22 #include "asio/generic/basic_endpoint.hpp" 23 24 #include "asio/detail/push_options.hpp" 25 26 namespace asio { 27 namespace generic { 28 29 /// Encapsulates the flags needed for a generic stream-oriented socket. 30 /** 31 * The asio::generic::stream_protocol class contains flags necessary for 32 * stream-oriented sockets of any address family and protocol. 33 * 34 * @par Examples 35 * Constructing using a native address family and socket protocol: 36 * @code stream_protocol p(AF_INET, IPPROTO_TCP); @endcode 37 * Constructing from a specific protocol type: 38 * @code stream_protocol p(asio::ip::tcp::v4()); @endcode 39 * 40 * @par Thread Safety 41 * @e Distinct @e objects: Safe.@n 42 * @e Shared @e objects: Safe. 43 * 44 * @par Concepts: 45 * Protocol. 46 */ 47 class stream_protocol 48 { 49 public: 50 /// Construct a protocol object for a specific address family and protocol. stream_protocol(int address_family,int socket_protocol)51 stream_protocol(int address_family, int socket_protocol) 52 : family_(address_family), 53 protocol_(socket_protocol) 54 { 55 } 56 57 /// Construct a generic protocol object from a specific protocol. 58 /** 59 * @throws @c bad_cast Thrown if the source protocol is not stream-oriented. 60 */ 61 template <typename Protocol> stream_protocol(const Protocol & source_protocol)62 stream_protocol(const Protocol& source_protocol) 63 : family_(source_protocol.family()), 64 protocol_(source_protocol.protocol()) 65 { 66 if (source_protocol.type() != type()) 67 { 68 std::bad_cast ex; 69 asio::detail::throw_exception(ex); 70 } 71 } 72 73 /// Obtain an identifier for the type of the protocol. type() const74 int type() const 75 { 76 return ASIO_OS_DEF(SOCK_STREAM); 77 } 78 79 /// Obtain an identifier for the protocol. protocol() const80 int protocol() const 81 { 82 return protocol_; 83 } 84 85 /// Obtain an identifier for the protocol family. family() const86 int family() const 87 { 88 return family_; 89 } 90 91 /// Compare two protocols for equality. operator ==(const stream_protocol & p1,const stream_protocol & p2)92 friend bool operator==(const stream_protocol& p1, const stream_protocol& p2) 93 { 94 return p1.family_ == p2.family_ && p1.protocol_ == p2.protocol_; 95 } 96 97 /// Compare two protocols for inequality. operator !=(const stream_protocol & p1,const stream_protocol & p2)98 friend bool operator!=(const stream_protocol& p1, const stream_protocol& p2) 99 { 100 return !(p1 == p2); 101 } 102 103 /// The type of an endpoint. 104 typedef basic_endpoint<stream_protocol> endpoint; 105 106 /// The generic socket type. 107 typedef basic_stream_socket<stream_protocol> socket; 108 109 110 private: 111 int family_; 112 int protocol_; 113 }; 114 115 } // namespace generic 116 } // namespace asio 117 118 #include "asio/detail/pop_options.hpp" 119 120 #endif // ASIO_GENERIC_STREAM_PROTOCOL_HPP 121