include/boost/corosio/native/native_tcp.hpp

100.0% Lines (11/11) 100.0% Functions (6/6)
include/boost/corosio/native/native_tcp.hpp
Line TLA Hits 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 /** @file native_tcp.hpp
11
12 Inline TCP protocol type using platform-specific constants.
13 All methods are `constexpr` or trivially inlined, giving zero
14 overhead compared to hand-written socket creation calls.
15
16 This header includes platform socket headers
17 (`<sys/socket.h>`, `<netinet/in.h>`, etc.).
18 For a version that avoids platform includes, use
19 `<boost/corosio/tcp.hpp>` (`boost::corosio::tcp`).
20
21 Both variants satisfy the same protocol-type interface and work
22 interchangeably with `tcp_socket::open` / `tcp_acceptor::open`.
23
24 @see boost::corosio::tcp
25 */
26
27 #ifndef BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
28 #define BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
29
30 #ifdef _WIN32
31 #include <winsock2.h>
32 #include <ws2tcpip.h>
33 #else
34 #include <netinet/in.h>
35 #include <sys/socket.h>
36 #endif
37
38 namespace boost::corosio {
39
40 class tcp_socket;
41 class tcp_acceptor;
42
43 } // namespace boost::corosio
44
45 namespace boost::corosio {
46
47 /** Inline TCP protocol type with platform constants.
48
49 Same shape as @ref boost::corosio::tcp but with inline
50 `family()`, `type()`, and `protocol()` methods that
51 resolve to compile-time constants.
52
53 @see boost::corosio::tcp
54 */
55 class native_tcp
56 {
57 bool v6_;
58 8403 explicit constexpr native_tcp(bool v6) noexcept : v6_(v6) {}
59
60 public:
61 /// Construct an IPv4 TCP protocol.
62 8377 static constexpr native_tcp v4() noexcept
63 {
64 8377 return native_tcp(false);
65 }
66
67 /// Construct an IPv6 TCP protocol.
68 26 static constexpr native_tcp v6() noexcept
69 {
70 26 return native_tcp(true);
71 }
72
73 /// Return true if this is IPv6.
74 constexpr bool is_v6() const noexcept
75 {
76 return v6_;
77 }
78
79 /// Return the address family (AF_INET or AF_INET6).
80 8403 int family() const noexcept
81 {
82 8403 return v6_ ? AF_INET6 : AF_INET;
83 }
84
85 /// Return the socket type (SOCK_STREAM).
86 8403 static constexpr int type() noexcept
87 {
88 8403 return SOCK_STREAM;
89 }
90
91 /// Return the IP protocol (IPPROTO_TCP).
92 8403 static constexpr int protocol() noexcept
93 {
94 8403 return IPPROTO_TCP;
95 }
96
97 /// The associated socket type.
98 using socket = tcp_socket;
99
100 /// The associated acceptor type.
101 using acceptor = tcp_acceptor;
102
103 friend constexpr bool operator==(native_tcp a, native_tcp b) noexcept
104 {
105 return a.v6_ == b.v6_;
106 }
107
108 friend constexpr bool operator!=(native_tcp a, native_tcp b) noexcept
109 {
110 return a.v6_ != b.v6_;
111 }
112 };
113
114 } // namespace boost::corosio
115
116 #endif // BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
117