1#ifndef UVW_UDP_INCLUDE_H
2#define UVW_UDP_INCLUDE_H
29 explicit UDPDataEvent(
Addr sndr, std::unique_ptr<
char[]> buf, std::size_t len,
bool part)
noexcept;
31 std::unique_ptr<char[]>
data;
39enum class UVUDPFlags : std::underlying_type_t<uv_udp_flags> {
40 IPV6ONLY = UV_UDP_IPV6ONLY,
41 UDP_PARTIAL = UV_UDP_PARTIAL,
42 REUSEADDR = UV_UDP_REUSEADDR,
43 UDP_MMSG_CHUNK = UV_UDP_MMSG_CHUNK,
44 UDP_MMSG_FREE = UV_UDP_MMSG_FREE,
45 UDP_LINUX_RECVERR = UV_UDP_LINUX_RECVERR,
46 UDP_RECVMMSG = UV_UDP_RECVMMSG
49enum class UVMembership : std::underlying_type_t<uv_membership> {
50 LEAVE_GROUP = UV_LEAVE_GROUP,
51 JOIN_GROUP = UV_JOIN_GROUP
54class SendReq final:
public Request<SendReq, uv_udp_send_t> {
56 using Deleter = void (*)(
char *);
58 SendReq(ConstructorAccess ca, std::shared_ptr<Loop>
loop, std::unique_ptr<
char[], Deleter> dt,
unsigned int len);
60 void send(uv_udp_t *handle,
const struct sockaddr *addr);
63 std::unique_ptr<char[], Deleter> data;
87 static void recvCallback(uv_udp_t *handle, ssize_t nread,
const uv_buf_t *buf,
const sockaddr *addr,
unsigned flags) {
88 const typename details::IpTraits<I>::Type *aptr =
reinterpret_cast<const typename details::IpTraits<I>::Type *
>(addr);
92 std::unique_ptr<char[]>
data{buf->base};
96 udp.publish(
UDPDataEvent{details::address<I>(aptr), std::move(
data),
static_cast<std::size_t
>(nread), !(0 == (flags & UV_UDP_PARTIAL))});
97 }
else if(nread == 0 && addr ==
nullptr) {
99 }
else if(nread == 0 && addr !=
nullptr) {
101 udp.publish(
UDPDataEvent{details::address<I>(aptr), std::move(
data),
static_cast<std::size_t
>(nread),
false});
109 using Membership = details::UVMembership;
110 using Bind = details::UVUDPFlags;
114 explicit UDPHandle(ConstructorAccess ca, std::shared_ptr<Loop> ref,
unsigned int f = {});
187 template<
typename I = IPv4>
188 void connect(
const std::string &ip,
unsigned int port);
203 template<
typename I = IPv4>
219 template<
typename I = IPv4>
243 template<typename I =
IPv4>
244 void bind(const std::
string &ip,
unsigned int port,
Flags<Bind> opts =
Flags<Bind>{});
266 template<
typename I = IPv4>
273 template<
typename I = IPv4>
289 template<typename I =
IPv4>
314 template<typename I =
IPv4>
348 void send(const sockaddr &addr, std::unique_ptr<
char[]>
data,
unsigned int len);
368 template<typename I =
IPv4>
369 void send(const std::
string &ip,
unsigned int port, std::unique_ptr<
char[]>
data,
unsigned int len);
388 template<typename I =
IPv4>
408 void send(const sockaddr &addr,
char *
data,
unsigned int len);
428 template<typename I =
IPv4>
429 void send(const std::
string &ip,
unsigned int port,
char *
data,
unsigned int len);
448 template<typename I =
IPv4>
462 template<typename I =
IPv4>
463 int trySend(const sockaddr &addr, std::unique_ptr<
char[]>
data,
unsigned int len);
477 template<typename I =
IPv4>
478 int trySend(const std::
string &ip,
unsigned int port, std::unique_ptr<
char[]>
data,
unsigned int len);
491 template<typename I =
IPv4>
505 template<typename I =
IPv4>
520 template<typename I =
IPv4>
521 int trySend(const std::
string &ip,
unsigned int port,
char *
data,
unsigned int len);
534 template<typename I =
IPv4>
547 template<typename I =
IPv4>
576 unsigned int flags{};
593extern template Addr UDPHandle::peer<IPv6>() const noexcept;
595extern template
void UDPHandle::bind<IPv4>(const std::
string &,
unsigned int, Flags<Bind>);
596extern template
void UDPHandle::bind<IPv6>(const std::
string &,
unsigned int, Flags<Bind>);
598extern template
void UDPHandle::bind<IPv4>(Addr, Flags<Bind>);
599extern template
void UDPHandle::bind<IPv6>(Addr, Flags<Bind>);
601extern template Addr UDPHandle::sock<IPv4>() const noexcept;
602extern template Addr UDPHandle::sock<IPv6>() const noexcept;
604extern template
bool UDPHandle::multicastMembership<IPv4>(const std::
string &, const std::
string &, Membership);
605extern template
bool UDPHandle::multicastMembership<IPv6>(const std::
string &, const std::
string &, Membership);
607extern template
bool UDPHandle::multicastInterface<IPv4>(const std::
string &);
608extern template
bool UDPHandle::multicastInterface<IPv6>(const std::
string &);
610extern template
void UDPHandle::send<IPv4>(const std::
string &,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
611extern template
void UDPHandle::send<IPv6>(const std::
string &,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
613extern template
void UDPHandle::send<IPv4>(Addr, std::unique_ptr<
char[]>,
unsigned int);
614extern template
void UDPHandle::send<IPv6>(Addr, std::unique_ptr<
char[]>,
unsigned int);
616extern template
void UDPHandle::send<IPv4>(const std::
string &,
unsigned int,
char *,
unsigned int);
617extern template
void UDPHandle::send<IPv6>(const std::
string &,
unsigned int,
char *,
unsigned int);
619extern template
void UDPHandle::send<IPv4>(Addr,
char *,
unsigned int);
620extern template
void UDPHandle::send<IPv6>(Addr,
char *,
unsigned int);
622extern template
int UDPHandle::trySend<IPv4>(const sockaddr &, std::unique_ptr<
char[]>,
unsigned int);
623extern template
int UDPHandle::trySend<IPv6>(const sockaddr &, std::unique_ptr<
char[]>,
unsigned int);
625extern template
int UDPHandle::trySend<IPv4>(const std::
string &,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
626extern template
int UDPHandle::trySend<IPv6>(const std::
string &,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
628extern template
int UDPHandle::trySend<IPv4>(Addr, std::unique_ptr<
char[]>,
unsigned int);
629extern template
int UDPHandle::trySend<IPv6>(Addr, std::unique_ptr<
char[]>,
unsigned int);
631extern template
int UDPHandle::trySend<IPv4>(const sockaddr &,
char *,
unsigned int);
632extern template
int UDPHandle::trySend<IPv6>(const sockaddr &,
char *,
unsigned int);
634extern template
int UDPHandle::trySend<IPv4>(const std::
string &,
unsigned int,
char *,
unsigned int);
635extern template
int UDPHandle::trySend<IPv6>(const std::
string &,
unsigned int,
char *,
unsigned int);
637extern template
int UDPHandle::trySend<IPv4>(Addr,
char *,
unsigned int);
638extern template
int UDPHandle::trySend<IPv6>(Addr,
char *,
unsigned int);
640extern template
void UDPHandle::recv<IPv4>();
641extern template
void UDPHandle::recv<IPv6>();
Utility class to handle flags.
std::shared_ptr< R > data() const
bool init()
Initializes the handle. The actual socket is created lazily.
void stop()
Stops listening for incoming datagrams.
bool broadcast(bool enable=false)
Sets broadcast on or off.
void connect(Addr addr)
Associates the handle to a remote address and port (either IPv4 or IPv6).
size_t sendQueueSize() const noexcept
Gets the number of bytes queued for sending.
void bind(const sockaddr &addr, Flags< Bind > opts=Flags< Bind >{})
Binds the UDP handle to an IP address and port.
int trySend(const sockaddr &addr, std::unique_ptr< char[]> data, unsigned int len)
Sends data over the UDP socket.
size_t sendQueueCount() const noexcept
Number of send requests currently in the queue awaiting to be processed.
void bind(Addr addr, Flags< Bind > opts=Flags< Bind >{})
Binds the UDP handle to an IP address and port.
bool multicastTtl(int val)
Sets the multicast ttl.
Addr peer() const noexcept
Gets the remote address to which the handle is connected, if any.
void send(const sockaddr &addr, std::unique_ptr< char[]> data, unsigned int len)
Sends data over the UDP socket.
void recv()
Prepares for receiving data.
bool multicastInterface(const std::string &iface)
Sets the multicast interface to send or receive data on.
bool ttl(int val)
Sets the time to live.
bool multicastMembership(const std::string &multicast, const std::string &iface, Membership membership)
Sets membership for a multicast address.
Addr sock() const noexcept
Get the local IP and port of the UDP handle.
void disconnect()
Disconnects the handle.
void connect(const sockaddr &addr)
Associates the handle to a remote address and port (either IPv4 or IPv6).
void open(OSSocketHandle socket)
Opens an existing file descriptor or SOCKET as a UDP handle.
void connect(const std::string &ip, unsigned int port)
Associates the handle to a remote address and port (either IPv4 or IPv6).
bool multicastLoop(bool enable=true)
Sets IP multicast loop flag.
Loop & loop() const noexcept
details::UVTypeWrapper< uv_os_sock_t > OSSocketHandle
std::unique_ptr< char[]> data