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  
/** @file native_tcp.hpp
10  
/** @file native_tcp.hpp
11  

11  

12  
    Inline TCP protocol type using platform-specific constants.
12  
    Inline TCP protocol type using platform-specific constants.
13  
    All methods are `constexpr` or trivially inlined, giving zero
13  
    All methods are `constexpr` or trivially inlined, giving zero
14  
    overhead compared to hand-written socket creation calls.
14  
    overhead compared to hand-written socket creation calls.
15  

15  

16  
    This header includes platform socket headers
16  
    This header includes platform socket headers
17  
    (`<sys/socket.h>`, `<netinet/in.h>`, etc.).
17  
    (`<sys/socket.h>`, `<netinet/in.h>`, etc.).
18  
    For a version that avoids platform includes, use
18  
    For a version that avoids platform includes, use
19  
    `<boost/corosio/tcp.hpp>` (`boost::corosio::tcp`).
19  
    `<boost/corosio/tcp.hpp>` (`boost::corosio::tcp`).
20  

20  

21  
    Both variants satisfy the same protocol-type interface and work
21  
    Both variants satisfy the same protocol-type interface and work
22  
    interchangeably with `tcp_socket::open` / `tcp_acceptor::open`.
22  
    interchangeably with `tcp_socket::open` / `tcp_acceptor::open`.
23  

23  

24  
    @see boost::corosio::tcp
24  
    @see boost::corosio::tcp
25  
*/
25  
*/
26  

26  

27  
#ifndef BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
27  
#ifndef BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
28  
#define BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
28  
#define BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
29  

29  

30  
#ifdef _WIN32
30  
#ifdef _WIN32
31  
#include <winsock2.h>
31  
#include <winsock2.h>
32  
#include <ws2tcpip.h>
32  
#include <ws2tcpip.h>
33  
#else
33  
#else
34  
#include <netinet/in.h>
34  
#include <netinet/in.h>
35  
#include <sys/socket.h>
35  
#include <sys/socket.h>
36  
#endif
36  
#endif
37  

37  

38  
namespace boost::corosio {
38  
namespace boost::corosio {
39  

39  

40  
class tcp_socket;
40  
class tcp_socket;
41  
class tcp_acceptor;
41  
class tcp_acceptor;
42  

42  

43  
} // namespace boost::corosio
43  
} // namespace boost::corosio
44  

44  

45  
namespace boost::corosio {
45  
namespace boost::corosio {
46  

46  

47  
/** Inline TCP protocol type with platform constants.
47  
/** Inline TCP protocol type with platform constants.
48  

48  

49  
    Same shape as @ref boost::corosio::tcp but with inline
49  
    Same shape as @ref boost::corosio::tcp but with inline
50  
    `family()`, `type()`, and `protocol()` methods that
50  
    `family()`, `type()`, and `protocol()` methods that
51  
    resolve to compile-time constants.
51  
    resolve to compile-time constants.
52  

52  

53  
    @see boost::corosio::tcp
53  
    @see boost::corosio::tcp
54  
*/
54  
*/
55  
class native_tcp
55  
class native_tcp
56  
{
56  
{
57  
    bool v6_;
57  
    bool v6_;
58  
    explicit constexpr native_tcp(bool v6) noexcept : v6_(v6) {}
58  
    explicit constexpr native_tcp(bool v6) noexcept : v6_(v6) {}
59  

59  

60  
public:
60  
public:
61  
    /// Construct an IPv4 TCP protocol.
61  
    /// Construct an IPv4 TCP protocol.
62  
    static constexpr native_tcp v4() noexcept
62  
    static constexpr native_tcp v4() noexcept
63  
    {
63  
    {
64  
        return native_tcp(false);
64  
        return native_tcp(false);
65  
    }
65  
    }
66  

66  

67  
    /// Construct an IPv6 TCP protocol.
67  
    /// Construct an IPv6 TCP protocol.
68  
    static constexpr native_tcp v6() noexcept
68  
    static constexpr native_tcp v6() noexcept
69  
    {
69  
    {
70  
        return native_tcp(true);
70  
        return native_tcp(true);
71  
    }
71  
    }
72  

72  

73  
    /// Return true if this is IPv6.
73  
    /// Return true if this is IPv6.
74  
    constexpr bool is_v6() const noexcept
74  
    constexpr bool is_v6() const noexcept
75  
    {
75  
    {
76  
        return v6_;
76  
        return v6_;
77  
    }
77  
    }
78  

78  

79  
    /// Return the address family (AF_INET or AF_INET6).
79  
    /// Return the address family (AF_INET or AF_INET6).
80  
    int family() const noexcept
80  
    int family() const noexcept
81  
    {
81  
    {
82  
        return v6_ ? AF_INET6 : AF_INET;
82  
        return v6_ ? AF_INET6 : AF_INET;
83  
    }
83  
    }
84  

84  

85  
    /// Return the socket type (SOCK_STREAM).
85  
    /// Return the socket type (SOCK_STREAM).
86  
    static constexpr int type() noexcept
86  
    static constexpr int type() noexcept
87  
    {
87  
    {
88  
        return SOCK_STREAM;
88  
        return SOCK_STREAM;
89  
    }
89  
    }
90  

90  

91  
    /// Return the IP protocol (IPPROTO_TCP).
91  
    /// Return the IP protocol (IPPROTO_TCP).
92  
    static constexpr int protocol() noexcept
92  
    static constexpr int protocol() noexcept
93  
    {
93  
    {
94  
        return IPPROTO_TCP;
94  
        return IPPROTO_TCP;
95  
    }
95  
    }
96  

96  

97  
    /// The associated socket type.
97  
    /// The associated socket type.
98  
    using socket = tcp_socket;
98  
    using socket = tcp_socket;
99  

99  

100  
    /// The associated acceptor type.
100  
    /// The associated acceptor type.
101  
    using acceptor = tcp_acceptor;
101  
    using acceptor = tcp_acceptor;
102  

102  

103  
    friend constexpr bool operator==(native_tcp a, native_tcp b) noexcept
103  
    friend constexpr bool operator==(native_tcp a, native_tcp b) noexcept
104  
    {
104  
    {
105  
        return a.v6_ == b.v6_;
105  
        return a.v6_ == b.v6_;
106  
    }
106  
    }
107  

107  

108  
    friend constexpr bool operator!=(native_tcp a, native_tcp b) noexcept
108  
    friend constexpr bool operator!=(native_tcp a, native_tcp b) noexcept
109  
    {
109  
    {
110  
        return a.v6_ != b.v6_;
110  
        return a.v6_ != b.v6_;
111  
    }
111  
    }
112  
};
112  
};
113  

113  

114  
} // namespace boost::corosio
114  
} // namespace boost::corosio
115  

115  

116  
#endif // BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
116  
#endif // BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP