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_UDP_HPP
 
11 +
#define BOOST_COROSIO_UDP_HPP
 
12 +

 
13 +
#include <boost/corosio/detail/config.hpp>
 
14 +

 
15 +
namespace boost::corosio {
 
16 +

 
17 +
class udp_socket;
 
18 +

 
19 +
/** Encapsulate the UDP protocol for socket creation.
 
20 +

 
21 +
    This class identifies the UDP protocol and its address family
 
22 +
    (IPv4 or IPv6). It is used to parameterize `udp_socket::open()`
 
23 +
    calls with a self-documenting type.
 
24 +

 
25 +
    The `family()`, `type()`, and `protocol()` members are
 
26 +
    implemented in the compiled library to avoid exposing
 
27 +
    platform socket headers. For an inline variant that includes
 
28 +
    platform headers, use @ref native_udp.
 
29 +

 
30 +
    @par Example
 
31 +
    @code
 
32 +
    udp_socket sock( ioc );
 
33 +
    sock.open( udp::v4() );
 
34 +
    sock.bind( endpoint( ipv4_address::any(), 9000 ) );
 
35 +
    @endcode
 
36 +

 
37 +
    @see native_udp, udp_socket
 
38 +
*/
 
39 +
class BOOST_COROSIO_DECL udp
 
40 +
{
 
41 +
    bool v6_;
 
42 +
    explicit constexpr udp(bool v6) noexcept : v6_(v6) {}
 
43 +

 
44 +
public:
 
45 +
    /// Construct an IPv4 UDP protocol.
 
46 +
    static constexpr udp v4() noexcept
 
47 +
    {
 
48 +
        return udp(false);
 
49 +
    }
 
50 +

 
51 +
    /// Construct an IPv6 UDP protocol.
 
52 +
    static constexpr udp v6() noexcept
 
53 +
    {
 
54 +
        return udp(true);
 
55 +
    }
 
56 +

 
57 +
    /// Return true if this is IPv6.
 
58 +
    constexpr bool is_v6() const noexcept
 
59 +
    {
 
60 +
        return v6_;
 
61 +
    }
 
62 +

 
63 +
    /// Return the address family (AF_INET or AF_INET6).
 
64 +
    int family() const noexcept;
 
65 +

 
66 +
    /// Return the socket type (SOCK_DGRAM).
 
67 +
    static int type() noexcept;
 
68 +

 
69 +
    /// Return the IP protocol (IPPROTO_UDP).
 
70 +
    static int protocol() noexcept;
 
71 +

 
72 +
    /// The associated socket type.
 
73 +
    using socket = udp_socket;
 
74 +

 
75 +
    /// Test for equality.
 
76 +
    friend constexpr bool operator==(udp a, udp b) noexcept
 
77 +
    {
 
78 +
        return a.v6_ == b.v6_;
 
79 +
    }
 
80 +

 
81 +
    /// Test for inequality.
 
82 +
    friend constexpr bool operator!=(udp a, udp b) noexcept
 
83 +
    {
 
84 +
        return a.v6_ != b.v6_;
 
85 +
    }
 
86 +
};
 
87 +

 
88 +
} // namespace boost::corosio
 
89 +

 
90 +
#endif // BOOST_COROSIO_UDP_HPP