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 are
 
27 +
    implemented in the compiled library to avoid exposing
 
28 +
    platform socket headers. For an inline variant that includes
 
29 +
    platform headers, use @ref native_tcp.
 
30 +

 
31 +
    @par Example
 
32 +
    @code
 
33 +
    tcp_acceptor acc( ioc );
 
34 +
    acc.open( tcp::v6() );  // IPv6 socket
 
35 +
    acc.set_option( socket_option::reuse_address( true ) );
 
36 +
    acc.bind( endpoint( ipv6_address::any(), 8080 ) );
 
37 +
    acc.listen();
 
38 +
    @endcode
 
39 +

 
40 +
    @see native_tcp, tcp_socket, tcp_acceptor
 
41 +
*/
 
42 +
class BOOST_COROSIO_DECL tcp
 
43 +
{
 
44 +
    bool v6_;
 
45 +
    explicit constexpr tcp( bool v6 ) noexcept : v6_( v6 ) {}
 
46 +

 
47 +
public:
 
48 +
    /// Construct an IPv4 TCP protocol.
 
49 +
    static constexpr tcp v4() noexcept { return tcp( false ); }
 
50 +

 
51 +
    /// Construct an IPv6 TCP protocol.
 
52 +
    static constexpr tcp v6() noexcept { return tcp( true ); }
 
53 +

 
54 +
    /// Return true if this is IPv6.
 
55 +
    constexpr bool is_v6() const noexcept { return v6_; }
 
56 +

 
57 +
    /// Return the address family (AF_INET or AF_INET6).
 
58 +
    int family() const noexcept;
 
59 +

 
60 +
    /// Return the socket type (SOCK_STREAM).
 
61 +
    static int type() noexcept;
 
62 +

 
63 +
    /// Return the IP protocol (IPPROTO_TCP).
 
64 +
    static int protocol() noexcept;
 
65 +

 
66 +
    /// The associated socket type.
 
67 +
    using socket = tcp_socket;
 
68 +

 
69 +
    /// The associated acceptor type.
 
70 +
    using acceptor = tcp_acceptor;
 
71 +

 
72 +
    friend constexpr bool operator==( tcp a, tcp b ) noexcept
 
73 +
    {
 
74 +
        return a.v6_ == b.v6_;
 
75 +
    }
 
76 +

 
77 +
    friend constexpr bool operator!=( tcp a, tcp b ) noexcept
 
78 +
    {
 
79 +
        return a.v6_ != b.v6_;
 
80 +
    }
 
81 +
};
 
82 +

 
83 +
} // namespace boost::corosio
 
84 +

 
85 +
#endif // BOOST_COROSIO_TCP_HPP