include/boost/corosio/native/native_tcp.hpp

100.0% Lines (7/7) 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 7862 explicit constexpr native_tcp( bool v6 ) noexcept : v6_( v6 ) {}
59
60 public:
61 /// Construct an IPv4 TCP protocol.
62 7836 static constexpr native_tcp v4() noexcept { return native_tcp( false ); }
63
64 /// Construct an IPv6 TCP protocol.
65 26 static constexpr native_tcp v6() noexcept { return native_tcp( true ); }
66
67 /// Return true if this is IPv6.
68 constexpr bool is_v6() const noexcept { return v6_; }
69
70 /// Return the address family (AF_INET or AF_INET6).
71 7862 int family() const noexcept
72 {
73 7862 return v6_ ? AF_INET6 : AF_INET;
74 }
75
76 /// Return the socket type (SOCK_STREAM).
77 7862 static constexpr int type() noexcept { return SOCK_STREAM; }
78
79 /// Return the IP protocol (IPPROTO_TCP).
80 7862 static constexpr int protocol() noexcept { return IPPROTO_TCP; }
81
82 /// The associated socket type.
83 using socket = tcp_socket;
84
85 /// The associated acceptor type.
86 using acceptor = tcp_acceptor;
87
88 friend constexpr bool operator==( native_tcp a, native_tcp b ) noexcept
89 {
90 return a.v6_ == b.v6_;
91 }
92
93 friend constexpr bool operator!=( native_tcp a, native_tcp b ) noexcept
94 {
95 return a.v6_ != b.v6_;
96 }
97 };
98
99 } // namespace boost::corosio
100
101 #endif // BOOST_COROSIO_NATIVE_NATIVE_TCP_HPP
102