uvco 0.1
Loading...
Searching...
No Matches
udp.h
Go to the documentation of this file.
1// uvco (c) 2023 Lewin Bormann. See LICENSE for specific terms.
2
3#pragma once
4
5#include <boost/assert.hpp>
6#include <sys/socket.h>
7#include <sys/types.h>
8#include <uv.h>
9#include <uv/unix.h>
10
11#include "uvco/bounded_queue.h"
16#include "uvco/run.h"
17
18#include <coroutine>
19#include <cstdint>
20#include <memory>
21#include <optional>
22#include <span>
23#include <string>
24#include <string_view>
25#include <utility>
26#include <variant>
27
28namespace uvco {
29
32
35class Udp {
36public:
38 explicit Udp(const Loop &loop);
39 Udp(Udp &&other) = default;
40 Udp &operator=(Udp &&other) = default;
41 Udp(const Udp &) = delete;
42 Udp &operator=(const Udp &) = delete;
43 ~Udp();
44
46 Promise<void> bind(std::string_view address, uint16_t port,
47 unsigned int flag = 0);
48 Promise<void> bind(const AddressHandle &address, unsigned int flag = 0);
49
51 Promise<void> connect(std::string_view address, uint16_t port,
52 bool ipv6only = false);
53 Promise<void> connect(const AddressHandle &address);
54
57 Promise<void> send(std::span<char> buffer,
58 std::optional<AddressHandle> address = {});
59
67
73
80
84 void
85 stopReceiveMany(MultiPromise<std::pair<std::string, AddressHandle>> &packets);
86
88 void setBroadcast(bool enabled);
90 void setTtl(uint8_t ttl);
92 void setMulticastInterface(const std::string &interfaceAddress);
95 void setMulticastLoop(bool enabled);
97 void joinMulticast(const std::string &address, const std::string &interface);
99 void leaveMulticast(const std::string &address, const std::string &interface);
100
102 [[nodiscard]] AddressHandle getSockname() const;
103
105 [[nodiscard]] std::optional<AddressHandle> getPeername() const;
106
110
111 [[nodiscard]] uv_udp_t *underlying() const;
112
113private:
114 const Loop *loop_;
115 std::unique_ptr<uv_udp_t> udp_;
116 bool connected_ = false;
117
118 bool is_receiving_ = false;
119
120 int udpStartReceive();
121 void udpStopReceive();
122
123 static void onReceiveOne(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf,
124 const struct sockaddr *addr, unsigned int flags);
125
127 static constexpr unsigned packetQueueSize = 128;
129 std::variant<std::pair<std::string, AddressHandle>, uv_status>;
130
131 RecvAwaiter_();
132 [[nodiscard]] bool await_ready() const;
133 bool await_suspend(std::coroutine_handle<> handle);
134 std::optional<std::pair<std::string, AddressHandle>> await_resume();
135
137 std::optional<std::coroutine_handle<>> handle_;
138 bool stop_receiving_ = true;
139 };
140
141 static void onSendDone(uv_udp_send_t *req, uv_status status);
142
144 [[nodiscard]] bool await_ready() const;
145 bool await_suspend(std::coroutine_handle<> h);
146 int await_resume();
147
148 std::optional<std::coroutine_handle<>> handle_;
149 std::optional<int> status_;
150 };
151};
152
154
155} // namespace uvco
AddressHandle is a light-weight wrapper around a struct sockaddr_in(6), and is therefore cheap to cop...
Definition name_resolution.h:38
Definition bounded_queue.h:23
Definition loop.h:26
Definition multipromise.h:133
Definition promise.h:76
Definition udp.h:35
AddressHandle getSockname() const
Obtain locally bound name of socket.
Definition udp.cc:328
const Loop * loop_
Definition udp.h:114
~Udp()
Definition udp.cc:38
Promise< void > bind(std::string_view address, uint16_t port, unsigned int flag=0)
Bind UDP socket to address.
Promise< std::pair< std::string, AddressHandle > > receiveOneFrom()
Definition udp.cc:138
MultiPromise< std::pair< std::string, AddressHandle > > receiveMany()
Definition udp.cc:157
int udpStartReceive()
Definition udp.cc:231
void setMulticastLoop(bool enabled)
Definition udp.cc:302
bool connected_
Definition udp.h:116
static void onReceiveOne(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf, const struct sockaddr *addr, unsigned int flags)
Definition udp.cc:236
Udp(const Loop &loop)
Set up a UDP object.
Definition udp.cc:34
Promise< void > send(std::span< char > buffer, std::optional< AddressHandle > address={})
Definition udp.cc:98
void stopReceiveMany(MultiPromise< std::pair< std::string, AddressHandle > > &packets)
Definition udp.cc:206
void joinMulticast(const std::string &address, const std::string &interface)
Join a multicast group.
Definition udp.cc:310
Promise< std::string > receiveOne()
Definition udp.cc:133
void setMulticastInterface(const std::string &interfaceAddress)
Set multicast interface for sending or receiving data.
Definition udp.cc:294
bool is_receiving_
Definition udp.h:118
Udp & operator=(Udp &&other)=default
void leaveMulticast(const std::string &address, const std::string &interface)
Leave multicast group.
Definition udp.cc:319
void setBroadcast(bool enabled)
Enable sending to broadcast addresses.
Definition udp.cc:279
void setTtl(uint8_t ttl)
Set TTL on sent packets. TTL must be between 1 and 255.
Definition udp.cc:287
uv_udp_t * underlying() const
Definition udp.cc:355
Promise< void > close()
Definition udp.cc:188
Udp(const Udp &)=delete
Udp(Udp &&other)=default
static void onSendDone(uv_udp_send_t *req, uv_status status)
Definition udp.cc:381
Udp & operator=(const Udp &)=delete
std::unique_ptr< uv_udp_t > udp_
Definition udp.h:115
Promise< void > connect(std::string_view address, uint16_t port, bool ipv6only=false)
Connect UDP socket to address.
Definition udp.cc:73
void udpStopReceive()
Definition udp.cc:226
std::optional< AddressHandle > getPeername() const
Obtain peer name if connected.
Definition udp.cc:340
int uv_status
Result of a libuv operation, an errno error code.
Definition internal_utils.h:22
Definition async_work.cc:17
Definition udp.h:126
bool stop_receiving_
Definition udp.h:138
RecvAwaiter_()
Definition udp.cc:357
std::optional< std::pair< std::string, AddressHandle > > await_resume()
Definition udp.cc:368
std::variant< std::pair< std::string, AddressHandle >, uv_status > QueueItem_
Definition udp.h:128
bool await_ready() const
Definition udp.cc:365
bool await_suspend(std::coroutine_handle<> handle)
Definition udp.cc:359
std::optional< std::coroutine_handle<> > handle_
Definition udp.h:137
static constexpr unsigned packetQueueSize
Definition udp.h:127
BoundedQueue< QueueItem_ > buffer_
Definition udp.h:136
Definition udp.h:143
int await_resume()
Definition udp.cc:399
std::optional< std::coroutine_handle<> > handle_
Definition udp.h:148
std::optional< int > status_
Definition udp.h:149
bool await_ready() const
Definition udp.cc:391
bool await_suspend(std::coroutine_handle<> h)
Definition udp.cc:393