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 : acc.open( tcp::v6() ); // IPv6 socket
36 : acc.set_option( socket_option::reuse_address( true ) );
37 : acc.bind( endpoint( ipv6_address::any(), 8080 ) );
38 : acc.listen();
39 : @endcode
40 :
41 : @see native_tcp, tcp_socket, tcp_acceptor
42 : */
43 : class BOOST_COROSIO_DECL tcp
44 : {
45 : bool v6_;
46 HIT 2250 : explicit constexpr tcp(bool v6) noexcept : v6_(v6) {}
47 :
48 : public:
49 : /// Construct an IPv4 TCP protocol.
50 2206 : static constexpr tcp v4() noexcept
51 : {
52 2206 : return tcp(false);
53 : }
54 :
55 : /// Construct an IPv6 TCP protocol.
56 44 : static constexpr tcp v6() noexcept
57 : {
58 44 : return tcp(true);
59 : }
60 :
61 : /// Return true if this is IPv6.
62 : constexpr bool is_v6() const noexcept
63 : {
64 : return v6_;
65 : }
66 :
67 : /// Return the address family (AF_INET or AF_INET6).
68 : int family() const noexcept;
69 :
70 : /// Return the socket type (SOCK_STREAM).
71 : static int type() noexcept;
72 :
73 : /// Return the IP protocol (IPPROTO_TCP).
74 : static int protocol() noexcept;
75 :
76 : /// The socket type to use with this protocol, @ref tcp_socket.
77 : using socket = tcp_socket;
78 :
79 : /// The acceptor type to use with this protocol, @ref tcp_acceptor.
80 : using acceptor = tcp_acceptor;
81 :
82 : /// Test for equality.
83 12 : friend constexpr bool operator==(tcp a, tcp b) noexcept
84 : {
85 12 : return a.v6_ == b.v6_;
86 : }
87 :
88 : /// Test for inequality.
89 : friend constexpr bool operator!=(tcp a, tcp b) noexcept
90 : {
91 : return a.v6_ != b.v6_;
92 : }
93 : };
94 :
95 : } // namespace boost::corosio
96 :
97 : #endif // BOOST_COROSIO_TCP_HPP
|