100.00% Lines (7/7) 100.00% Functions (4/4)
TLA Baseline Branch
Line Hits Code Line Hits Code
1   // 1   //
2   // Copyright (c) 2026 Steve Gerbino 2   // Copyright (c) 2026 Steve Gerbino
3   // 3   //
4   // Distributed under the Boost Software License, Version 1.0. (See accompanying 4   // Distributed under the Boost Software License, Version 1.0. (See accompanying
5   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5   // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6   // 6   //
7   // Official repository: https://github.com/cppalliance/corosio 7   // Official repository: https://github.com/cppalliance/corosio
8   // 8   //
9   9  
10   #ifndef BOOST_COROSIO_TCP_HPP 10   #ifndef BOOST_COROSIO_TCP_HPP
11   #define BOOST_COROSIO_TCP_HPP 11   #define BOOST_COROSIO_TCP_HPP
12   12  
13   #include <boost/corosio/detail/config.hpp> 13   #include <boost/corosio/detail/config.hpp>
14   14  
15   namespace boost::corosio { 15   namespace boost::corosio {
16   16  
17   class tcp_socket; 17   class tcp_socket;
18   class tcp_acceptor; 18   class tcp_acceptor;
19   19  
20   /** Encapsulate the TCP protocol for socket creation. 20   /** Encapsulate the TCP protocol for socket creation.
21   21  
22   This class identifies the TCP protocol and its address family 22   This class identifies the TCP protocol and its address family
23   (IPv4 or IPv6). It is used to parameterize socket and acceptor 23   (IPv4 or IPv6). It is used to parameterize socket and acceptor
24   `open()` calls with a self-documenting type. 24   `open()` calls with a self-documenting type.
25   25  
26   The `family()`, `type()`, and `protocol()` members are 26   The `family()`, `type()`, and `protocol()` members are
27   implemented in the compiled library to avoid exposing 27   implemented in the compiled library to avoid exposing
28   platform socket headers. For an inline variant that includes 28   platform socket headers. For an inline variant that includes
29   platform headers, use @ref native_tcp. 29   platform headers, use @ref native_tcp.
30   30  
31   @par Example 31   @par Example
32   @code 32   @code
33   tcp_acceptor acc( ioc ); 33   tcp_acceptor acc( ioc );
34   acc.open( tcp::v6() ); // IPv6 socket 34   acc.open( tcp::v6() ); // IPv6 socket
35   acc.set_option( socket_option::reuse_address( true ) ); 35   acc.set_option( socket_option::reuse_address( true ) );
36   acc.bind( endpoint( ipv6_address::any(), 8080 ) ); 36   acc.bind( endpoint( ipv6_address::any(), 8080 ) );
37   acc.listen(); 37   acc.listen();
38   @endcode 38   @endcode
39   39  
40   @see native_tcp, tcp_socket, tcp_acceptor 40   @see native_tcp, tcp_socket, tcp_acceptor
41   */ 41   */
42   class BOOST_COROSIO_DECL tcp 42   class BOOST_COROSIO_DECL tcp
43   { 43   {
44   bool v6_; 44   bool v6_;
HITCBC 45   6538 explicit constexpr tcp(bool v6) noexcept : v6_(v6) {} 45   7748 explicit constexpr tcp(bool v6) noexcept : v6_(v6) {}
46   46  
47   public: 47   public:
48   /// Construct an IPv4 TCP protocol. 48   /// Construct an IPv4 TCP protocol.
HITCBC 49   6494 static constexpr tcp v4() noexcept 49   7704 static constexpr tcp v4() noexcept
50   { 50   {
HITCBC 51   6494 return tcp(false); 51   7704 return tcp(false);
52   } 52   }
53   53  
54   /// Construct an IPv6 TCP protocol. 54   /// Construct an IPv6 TCP protocol.
HITCBC 55   44 static constexpr tcp v6() noexcept 55   44 static constexpr tcp v6() noexcept
56   { 56   {
HITCBC 57   44 return tcp(true); 57   44 return tcp(true);
58   } 58   }
59   59  
60   /// Return true if this is IPv6. 60   /// Return true if this is IPv6.
61   constexpr bool is_v6() const noexcept 61   constexpr bool is_v6() const noexcept
62   { 62   {
63   return v6_; 63   return v6_;
64   } 64   }
65   65  
66   /// Return the address family (AF_INET or AF_INET6). 66   /// Return the address family (AF_INET or AF_INET6).
67   int family() const noexcept; 67   int family() const noexcept;
68   68  
69   /// Return the socket type (SOCK_STREAM). 69   /// Return the socket type (SOCK_STREAM).
70   static int type() noexcept; 70   static int type() noexcept;
71   71  
72   /// Return the IP protocol (IPPROTO_TCP). 72   /// Return the IP protocol (IPPROTO_TCP).
73   static int protocol() noexcept; 73   static int protocol() noexcept;
74   74  
75   /// The associated socket type. 75   /// The associated socket type.
76   using socket = tcp_socket; 76   using socket = tcp_socket;
77   77  
78   /// The associated acceptor type. 78   /// The associated acceptor type.
79   using acceptor = tcp_acceptor; 79   using acceptor = tcp_acceptor;
80   80  
81   /// Test for equality. 81   /// Test for equality.
HITCBC 82   12 friend constexpr bool operator==(tcp a, tcp b) noexcept 82   12 friend constexpr bool operator==(tcp a, tcp b) noexcept
83   { 83   {
HITCBC 84   12 return a.v6_ == b.v6_; 84   12 return a.v6_ == b.v6_;
85   } 85   }
86   86  
87   /// Test for inequality. 87   /// Test for inequality.
88   friend constexpr bool operator!=(tcp a, tcp b) noexcept 88   friend constexpr bool operator!=(tcp a, tcp b) noexcept
89   { 89   {
90   return a.v6_ != b.v6_; 90   return a.v6_ != b.v6_;
91   } 91   }
92   }; 92   };
93   93  
94   } // namespace boost::corosio 94   } // namespace boost::corosio
95   95  
96   #endif // BOOST_COROSIO_TCP_HPP 96   #endif // BOOST_COROSIO_TCP_HPP