TLA Line data Source code
1 : //
2 : // Copyright (c) 2026 Steve Gerbino
3 : //
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)
6 : //
7 : // Official repository: https://github.com/cppalliance/corosio
8 : //
9 :
10 : #ifndef BOOST_COROSIO_TCP_HPP
11 : #define BOOST_COROSIO_TCP_HPP
12 :
13 : #include <boost/corosio/detail/config.hpp>
14 :
15 : namespace boost::corosio {
16 :
17 : class tcp_socket;
18 : class tcp_acceptor;
19 :
20 : /** Encapsulate the TCP protocol for socket creation.
21 :
22 : This class identifies the TCP protocol and its address family
23 : (IPv4 or IPv6). It is used to parameterize socket and acceptor
24 : `open()` calls with a self-documenting type.
25 :
26 : The `family()`, `type()`, and `protocol()` members return the
27 : three integers passed to the operating system's `socket()`
28 : call. Their values are platform-defined constants taken from
29 : the system socket headers. For an inline variant that includes
30 : those headers, use @ref native_tcp.
31 :
32 : @par Example
33 : @code
34 : tcp_acceptor acc( ioc );
35 : if ( auto ec = acc.open( tcp::v6() ) ) // IPv6 socket
36 : return;
37 : acc.set_option( socket_option::reuse_address( true ) );
38 : if ( auto ec = acc.bind( endpoint( ipv6_address::any(), 8080 ) ) )
39 : return;
40 : if ( auto ec = acc.listen() )
41 : return;
42 : @endcode
43 :
44 : @see native_tcp, tcp_socket, tcp_acceptor
45 : */
46 : class BOOST_COROSIO_DECL tcp
47 : {
48 : bool v6_;
49 HIT 7517 : explicit constexpr tcp(bool v6) noexcept : v6_(v6) {}
50 :
51 : public:
52 : /// Construct an IPv4 TCP protocol.
53 7465 : static constexpr tcp v4() noexcept
54 : {
55 7465 : return tcp(false);
56 : }
57 :
58 : /// Construct an IPv6 TCP protocol.
59 52 : static constexpr tcp v6() noexcept
60 : {
61 52 : return tcp(true);
62 : }
63 :
64 : /// Return true if this is IPv6.
65 : constexpr bool is_v6() const noexcept
66 : {
67 : return v6_;
68 : }
69 :
70 : /// Return the address family (AF_INET or AF_INET6).
71 : int family() const noexcept;
72 :
73 : /// Return the socket type (SOCK_STREAM).
74 : static int type() noexcept;
75 :
76 : /// Return the IP protocol (IPPROTO_TCP).
77 : static int protocol() noexcept;
78 :
79 : /// The socket type to use with this protocol, @ref tcp_socket.
80 : using socket = tcp_socket;
81 :
82 : /// The acceptor type to use with this protocol, @ref tcp_acceptor.
83 : using acceptor = tcp_acceptor;
84 :
85 : /// Test for equality.
86 12 : friend constexpr bool operator==(tcp a, tcp b) noexcept
87 : {
88 12 : return a.v6_ == b.v6_;
89 : }
90 :
91 : /// Test for inequality.
92 : friend constexpr bool operator!=(tcp a, tcp b) noexcept
93 : {
94 : return a.v6_ != b.v6_;
95 : }
96 : };
97 :
98 : } // namespace boost::corosio
99 :
100 : #endif // BOOST_COROSIO_TCP_HPP
|