src/corosio/src/udp_socket.cpp

97.7% Lines (42/43) 100.0% List of functions (10/10)
udp_socket.cpp
f(x) Functions (10)
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 #include <boost/corosio/udp_socket.hpp>
11 #include <boost/corosio/detail/except.hpp>
12 #include <boost/corosio/detail/platform.hpp>
13
14 #include <boost/corosio/detail/udp_service.hpp>
15
16 namespace boost::corosio {
17
18 304x udp_socket::~udp_socket()
19 {
20 304x close();
21 304x }
22
23 244x udp_socket::udp_socket(capy::execution_context& ctx)
24 244x : io_object(create_handle<detail::udp_service>(ctx))
25 {
26 244x }
27
28 void
29 268x udp_socket::open(udp proto)
30 {
31 268x if (is_open())
32 3x return;
33 265x open_for_family(proto.family(), proto.type(), proto.protocol());
34 }
35
36 void
37 265x udp_socket::open_for_family(int family, int type, int protocol)
38 {
39 265x auto& svc = static_cast<detail::udp_service&>(h_.service());
40 265x std::error_code ec = svc.open_datagram_socket(
41 265x static_cast<udp_socket::implementation&>(*h_.get()), family, type,
42 protocol);
43 265x if (ec)
44 detail::throw_system_error(ec, "udp_socket::open");
45 265x }
46
47 void
48 426x udp_socket::close()
49 {
50 426x if (!is_open())
51 161x return;
52 265x h_.service().close(h_);
53 }
54
55 std::error_code
56 154x udp_socket::bind(endpoint ep)
57 {
58 154x if (!is_open())
59 3x detail::throw_logic_error("bind: socket not open");
60 151x auto& svc = static_cast<detail::udp_service&>(h_.service());
61 151x return svc.bind_datagram(
62 302x static_cast<udp_socket::implementation&>(*h_.get()), ep);
63 }
64
65 void
66 17x udp_socket::cancel()
67 {
68 17x if (!is_open())
69 3x return;
70 14x get().cancel();
71 }
72
73 native_handle_type
74 9x udp_socket::native_handle() const noexcept
75 {
76 9x if (!is_open())
77 {
78 #if BOOST_COROSIO_HAS_IOCP
79 return static_cast<native_handle_type>(~0ull); // INVALID_SOCKET
80 #else
81 3x return -1;
82 #endif
83 }
84 6x return get().native_handle();
85 }
86
87 endpoint
88 92x udp_socket::local_endpoint() const noexcept
89 {
90 92x if (!is_open())
91 3x return endpoint{};
92 89x return get().local_endpoint();
93 }
94
95 endpoint
96 9x udp_socket::remote_endpoint() const noexcept
97 {
98 9x if (!is_open())
99 3x return endpoint{};
100 6x return get().remote_endpoint();
101 }
102
103 } // namespace boost::corosio
104