1 #ifndef UVW_UDP_INCLUDE_H
2 #define UVW_UDP_INCLUDE_H
11 #include "request.hpp"
33 explicit UDPDataEvent(
Addr sndr, std::unique_ptr<
char[]> buf, std::size_t len,
bool part) noexcept;
35 std::unique_ptr<char[]>
data;
45 enum class UVUDPFlags: std::underlying_type_t<uv_udp_flags> {
46 IPV6ONLY = UV_UDP_IPV6ONLY,
47 UDP_PARTIAL = UV_UDP_PARTIAL,
48 REUSEADDR = UV_UDP_REUSEADDR,
49 UDP_MMSG_CHUNK = UV_UDP_MMSG_CHUNK,
50 UDP_MMSG_FREE = UV_UDP_MMSG_FREE,
51 UDP_LINUX_RECVERR = UV_UDP_LINUX_RECVERR,
52 UDP_RECVMMSG = UV_UDP_RECVMMSG
56 enum class UVMembership: std::underlying_type_t<uv_membership> {
57 LEAVE_GROUP = UV_LEAVE_GROUP,
58 JOIN_GROUP = UV_JOIN_GROUP
62 class SendReq final:
public Request<SendReq, uv_udp_send_t> {
64 using Deleter = void(*)(
char *);
66 SendReq(ConstructorAccess ca, std::shared_ptr<Loop> loop, std::unique_ptr<
char[], Deleter> dt,
unsigned int len);
68 void send(uv_udp_t *handle,
const struct sockaddr* addr);
71 std::unique_ptr<char[], Deleter>
data;
97 static void recvCallback(uv_udp_t *handle, ssize_t nread,
const uv_buf_t *buf,
const sockaddr *addr,
unsigned flags) {
98 const typename details::IpTraits<I>::Type *aptr =
reinterpret_cast<const typename details::IpTraits<I>::Type *
>(addr);
102 std::unique_ptr<char[]>
data{buf->base};
106 udp.publish(
UDPDataEvent{details::address<I>(aptr), std::move(
data),
static_cast<std::size_t
>(nread), !(0 == (flags & UV_UDP_PARTIAL))});
107 }
else if(nread == 0 && addr ==
nullptr) {
109 }
else if(nread == 0 && addr !=
nullptr) {
111 udp.publish(
UDPDataEvent{details::address<I>(aptr), std::move(
data),
static_cast<std::size_t
>(nread),
false});
119 using Membership = details::UVMembership;
120 using Bind = details::UVUDPFlags;
124 explicit UDPHandle(ConstructorAccess ca, std::shared_ptr<Loop> ref,
unsigned int f = {});
197 template<
typename I = IPv4>
198 void connect(
const std::string &ip,
unsigned int port);
213 template<
typename I = IPv4>
229 template<
typename I = IPv4>
253 template<typename I =
IPv4>
254 void bind(const std::
string &ip,
unsigned int port,
Flags<Bind> opts =
Flags<Bind>{});
276 template<
typename I = IPv4>
283 template<
typename I = IPv4>
299 template<typename I =
IPv4>
324 template<typename I =
IPv4>
358 void send(const sockaddr &addr, std::unique_ptr<
char[]>
data,
unsigned int len);
378 template<typename I =
IPv4>
379 void send(const std::
string &ip,
unsigned int port, std::unique_ptr<
char[]>
data,
unsigned int len);
398 template<typename I =
IPv4>
418 void send(const sockaddr &addr,
char *
data,
unsigned int len);
438 template<typename I =
IPv4>
439 void send(const std::
string &ip,
unsigned int port,
char *
data,
unsigned int len);
458 template<typename I =
IPv4>
472 template<typename I =
IPv4>
473 int trySend(const sockaddr &addr, std::unique_ptr<
char[]>
data,
unsigned int len);
487 template<typename I =
IPv4>
488 int trySend(const std::
string &ip,
unsigned int port, std::unique_ptr<
char[]>
data,
unsigned int len);
501 template<typename I =
IPv4>
515 template<typename I =
IPv4>
530 template<typename I =
IPv4>
531 int trySend(const std::
string &ip,
unsigned int port,
char *
data,
unsigned int len);
544 template<typename I =
IPv4>
557 template<typename I =
IPv4>
581 enum { DEFAULT, FLAGS } tag{DEFAULT};
582 unsigned int flags{};
594 extern template void UDPHandle::connect<IPv4>(
const std::string &,
unsigned int);
595 extern template void UDPHandle::connect<IPv6>(
const std::string &,
unsigned int);
597 extern template void UDPHandle::connect<IPv4>(Addr);
598 extern template void UDPHandle::connect<IPv6>(Addr);
600 extern template Addr UDPHandle::peer<IPv4>() const noexcept;
601 extern template Addr UDPHandle::peer<IPv6>() const noexcept;
603 extern template
void UDPHandle::bind<IPv4>(const std::
string &,
unsigned int, Flags<Bind>);
604 extern template
void UDPHandle::bind<IPv6>(const std::
string &,
unsigned int, Flags<Bind>);
606 extern template
void UDPHandle::bind<IPv4>(Addr, Flags<Bind>);
607 extern template
void UDPHandle::bind<IPv6>(Addr, Flags<Bind>);
609 extern template Addr UDPHandle::sock<IPv4>() const noexcept;
610 extern template Addr UDPHandle::sock<IPv6>() const noexcept;
612 extern template
bool UDPHandle::multicastMembership<IPv4>(const std::
string &, const std::
string &, Membership);
613 extern template
bool UDPHandle::multicastMembership<IPv6>(const std::
string &, const std::
string &, Membership);
615 extern template
bool UDPHandle::multicastInterface<IPv4>(const std::
string &);
616 extern template
bool UDPHandle::multicastInterface<IPv6>(const std::
string &);
618 extern template
void UDPHandle::send<IPv4>(const std::
string &,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
619 extern template
void UDPHandle::send<IPv6>(const std::
string &,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
621 extern template
void UDPHandle::send<IPv4>(Addr, std::unique_ptr<
char[]>,
unsigned int);
622 extern template
void UDPHandle::send<IPv6>(Addr, std::unique_ptr<
char[]>,
unsigned int);
624 extern template
void UDPHandle::send<IPv4>(const std::
string &,
unsigned int,
char *,
unsigned int);
625 extern template
void UDPHandle::send<IPv6>(const std::
string &,
unsigned int,
char *,
unsigned int);
627 extern template
void UDPHandle::send<IPv4>(Addr,
char *,
unsigned int);
628 extern template
void UDPHandle::send<IPv6>(Addr,
char *,
unsigned int);
630 extern template
int UDPHandle::trySend<IPv4>(const sockaddr &, std::unique_ptr<
char[]>,
unsigned int);
631 extern template
int UDPHandle::trySend<IPv6>(const sockaddr &, std::unique_ptr<
char[]>,
unsigned int);
633 extern template
int UDPHandle::trySend<IPv4>(const std::
string &,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
634 extern template
int UDPHandle::trySend<IPv6>(const std::
string &,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
636 extern template
int UDPHandle::trySend<IPv4>(Addr, std::unique_ptr<
char[]>,
unsigned int);
637 extern template
int UDPHandle::trySend<IPv6>(Addr, std::unique_ptr<
char[]>,
unsigned int);
639 extern template
int UDPHandle::trySend<IPv4>(const sockaddr &,
char *,
unsigned int);
640 extern template
int UDPHandle::trySend<IPv6>(const sockaddr &,
char *,
unsigned int);
642 extern template
int UDPHandle::trySend<IPv4>(const std::
string &,
unsigned int,
char *,
unsigned int);
643 extern template
int UDPHandle::trySend<IPv6>(const std::
string &,
unsigned int,
char *,
unsigned int);
645 extern template
int UDPHandle::trySend<IPv4>(Addr,
char *,
unsigned int);
646 extern template
int UDPHandle::trySend<IPv6>(Addr,
char *,
unsigned int);
648 extern template
void UDPHandle::recv<IPv4>();
649 extern template
void UDPHandle::recv<IPv6>();
Utility class to handle flags.
std::shared_ptr< R > data() const
Gets user-defined data. uvw won't use this field in any case.
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.
details::UVTypeWrapper< uv_os_sock_t > OSSocketHandle
std::unique_ptr< char[]> data