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 <uv.h>
6#include <uv/unix.h>
7
12#include "uvco/run.h"
13
14#include <cstdint>
15#include <memory>
16#include <optional>
17#include <span>
18#include <string>
19#include <string_view>
20#include <utility>
21
22namespace uvco {
23
26
28class Udp {
29 struct SendAwaiter_;
30 struct RecvAwaiter_;
31
32public:
34 explicit Udp(const Loop &loop);
35 Udp(Udp &&other) = default;
36 Udp &operator=(Udp &&other) = default;
37 Udp(const Udp &) = delete;
38 Udp &operator=(const Udp &) = delete;
39 ~Udp();
40
42 Promise<void> bind(std::string_view address, uint16_t port,
43 unsigned int flag = 0);
44 Promise<void> bind(const AddressHandle &address, unsigned int flag = 0);
45
47 Promise<void> connect(std::string_view address, uint16_t port,
48 bool ipv6only = false);
49 Promise<void> connect(const AddressHandle &address);
50
53 Promise<void> send(std::span<const char> buffer,
54 std::optional<AddressHandle> address = {});
55
63
69
76
80 void
81 stopReceiveMany(MultiPromise<std::pair<std::string, AddressHandle>> &packets);
82
84 void setBroadcast(bool enabled);
86 void setTtl(uint8_t ttl);
88 void setMulticastInterface(const std::string &interfaceAddress);
91 void setMulticastLoop(bool enabled);
93 void joinMulticast(const std::string &address, const std::string &interface);
95 void leaveMulticast(const std::string &address, const std::string &interface);
96
98 [[nodiscard]] AddressHandle getSockname() const;
99
101 [[nodiscard]] std::optional<AddressHandle> getPeername() const;
102
106 void close();
107
108private:
109 const Loop *loop_;
110 std::unique_ptr<uv_udp_t> udp_;
111 bool connected_ = false;
112
113 int udpStartReceive();
114 void udpStopReceive();
115
116 static void onSendDone(uv_udp_send_t *req, uv_status status);
117 static void onReceiveOne(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf,
118 const struct sockaddr *addr, unsigned int flags);
119};
120
122
123} // namespace uvco
AddressHandle is a light-weight wrapper around a struct / sockaddr_in(6), and is therefore cheap to c...
Definition name_resolution.h:32
Definition loop.h:26
Definition multipromise.h:127
Definition promise.h:49
AddressHandle getSockname() const
Obtain locally bound name of socket.
Definition udp.cc:352
const Loop * loop_
Definition udp.h:109
~Udp()
Definition udp.cc:78
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:169
MultiPromise< std::pair< std::string, AddressHandle > > receiveMany()
Definition udp.cc:189
int udpStartReceive()
Definition udp.cc:251
void setMulticastLoop(bool enabled)
Definition udp.cc:326
bool connected_
Definition udp.h:111
void close()
Definition udp.cc:218
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:256
Udp(const Loop &loop)
Set up a UDP object.
Definition udp.cc:74
void stopReceiveMany(MultiPromise< std::pair< std::string, AddressHandle > > &packets)
Definition udp.cc:239
void joinMulticast(const std::string &address, const std::string &interface)
Join a multicast group.
Definition udp.cc:334
Promise< std::string > receiveOne()
Definition udp.cc:163
void setMulticastInterface(const std::string &interfaceAddress)
Set multicast interface for sending or receiving data.
Definition udp.cc:318
Udp & operator=(Udp &&other)=default
void leaveMulticast(const std::string &address, const std::string &interface)
Leave multicast group.
Definition udp.cc:343
void setBroadcast(bool enabled)
Enable sending to broadcast addresses.
Definition udp.cc:303
void setTtl(uint8_t ttl)
Set TTL on sent packets. TTL must be between 1 and 255.
Definition udp.cc:311
Udp(const Udp &)=delete
Udp(Udp &&other)=default
static void onSendDone(uv_udp_send_t *req, uv_status status)
Definition udp.cc:407
Promise< void > send(std::span< const char > buffer, std::optional< AddressHandle > address={})
Definition udp.cc:134
Udp & operator=(const Udp &)=delete
std::unique_ptr< uv_udp_t > udp_
Definition udp.h:110
Promise< void > connect(std::string_view address, uint16_t port, bool ipv6only=false)
Connect UDP socket to address.
Definition udp.cc:107
void udpStopReceive()
Definition udp.cc:246
std::optional< AddressHandle > getPeername() const
Obtain peer name if connected.
Definition udp.cc:364
int uv_status
Result of a libuv operation, an errno error code.
Definition internal_utils.h:22
Definition async_work.cc:18
Definition udp.cc:35
Definition udp.cc:57