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_RECVMMSG = UV_UDP_RECVMMSG
54 enum class UVMembership: std::underlying_type_t<uv_membership> {
55 LEAVE_GROUP = UV_LEAVE_GROUP,
56 JOIN_GROUP = UV_JOIN_GROUP
60 class SendReq final:
public Request<SendReq, uv_udp_send_t> {
62 using Deleter = void(*)(
char *);
64 SendReq(ConstructorAccess ca, std::shared_ptr<Loop> loop, std::unique_ptr<
char[], Deleter> dt,
unsigned int len);
66 void send(uv_udp_t *handle,
const struct sockaddr* addr);
69 std::unique_ptr<char[], Deleter>
data;
95 static void recvCallback(uv_udp_t *handle, ssize_t nread,
const uv_buf_t *buf,
const sockaddr *addr,
unsigned flags) {
96 const typename details::IpTraits<I>::Type *aptr =
reinterpret_cast<const typename details::IpTraits<I>::Type *
>(addr);
100 std::unique_ptr<char[]>
data{buf->base};
104 udp.publish(
UDPDataEvent{details::address<I>(aptr), std::move(
data),
static_cast<std::size_t
>(nread), !(0 == (flags & UV_UDP_PARTIAL))});
105 }
else if(nread == 0 && addr ==
nullptr) {
107 }
else if(nread == 0 && addr !=
nullptr) {
109 udp.publish(
UDPDataEvent{details::address<I>(aptr), std::move(
data),
static_cast<std::size_t
>(nread),
false});
117 using Membership = details::UVMembership;
118 using Bind = details::UVUDPFlags;
122 using Handle::Handle;
124 explicit UDPHandle(ConstructorAccess ca, std::shared_ptr<Loop> ref,
unsigned int f);
178 void connect(
const sockaddr &addr);
194 template<
typename I = IPv4>
195 void connect(std::string ip,
unsigned int port);
210 template<
typename I = IPv4>
226 template<
typename I = IPv4>
248 template<
typename I = IPv4>
269 template<
typename I = IPv4>
276 template<
typename I = IPv4>
292 template<
typename I = IPv4>
317 template<
typename I = IPv4>
351 void send(
const sockaddr &addr, std::unique_ptr<
char[]>
data,
unsigned int len);
371 template<
typename I = IPv4>
372 void send(std::string ip,
unsigned int port, std::unique_ptr<
char[]>
data,
unsigned int len);
391 template<
typename I = IPv4>
392 void send(
Addr addr, std::unique_ptr<
char[]>
data,
unsigned int len);
411 void send(
const sockaddr &addr,
char *
data,
unsigned int len);
431 template<
typename I = IPv4>
432 void send(std::string ip,
unsigned int port,
char *
data,
unsigned int len);
451 template<
typename I = IPv4>
465 template<
typename I = IPv4>
466 int trySend(
const sockaddr &addr, std::unique_ptr<
char[]>
data,
unsigned int len);
480 template<
typename I = IPv4>
481 int trySend(std::string ip,
unsigned int port, std::unique_ptr<
char[]>
data,
unsigned int len);
494 template<
typename I = IPv4>
495 int trySend(
Addr addr, std::unique_ptr<
char[]>
data,
unsigned int len);
508 template<
typename I = IPv4>
509 int trySend(
const sockaddr &addr,
char *
data,
unsigned int len);
523 template<
typename I = IPv4>
524 int trySend(std::string ip,
unsigned int port,
char *
data,
unsigned int len);
537 template<
typename I = IPv4>
550 template<
typename I = IPv4>
574 enum { DEFAULT, FLAGS } tag{DEFAULT};
575 unsigned int flags{};
587 extern template void UDPHandle::connect<IPv4>(std::string,
unsigned int);
588 extern template void UDPHandle::connect<IPv6>(std::string,
unsigned int);
590 extern template void UDPHandle::connect<IPv4>(
Addr);
591 extern template void UDPHandle::connect<IPv6>(
Addr);
593 extern template Addr UDPHandle::peer<IPv4>() const noexcept;
605 extern template
bool UDPHandle::multicastMembership<
IPv4>(std::
string, std::
string, Membership);
606 extern template
bool UDPHandle::multicastMembership<
IPv6>(std::
string, std::
string, Membership);
608 extern template
bool UDPHandle::multicastInterface<
IPv4>(std::
string);
609 extern template
bool UDPHandle::multicastInterface<
IPv6>(std::
string);
611 extern template
void UDPHandle::send<
IPv4>(std::
string,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
612 extern template
void UDPHandle::send<
IPv6>(std::
string,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
614 extern template
void UDPHandle::send<
IPv4>(
Addr, std::unique_ptr<
char[]>,
unsigned int);
615 extern template
void UDPHandle::send<
IPv6>(
Addr, std::unique_ptr<
char[]>,
unsigned int);
617 extern template
void UDPHandle::send<
IPv4>(std::
string,
unsigned int,
char *,
unsigned int);
618 extern template
void UDPHandle::send<
IPv6>(std::
string,
unsigned int,
char *,
unsigned int);
623 extern template
int UDPHandle::trySend<
IPv4>(const sockaddr &, std::unique_ptr<
char[]>,
unsigned int);
624 extern template
int UDPHandle::trySend<
IPv6>(const sockaddr &, std::unique_ptr<
char[]>,
unsigned int);
626 extern template
int UDPHandle::trySend<
IPv4>(std::
string,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
627 extern template
int UDPHandle::trySend<
IPv6>(std::
string,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
629 extern template
int UDPHandle::trySend<
IPv4>(
Addr, std::unique_ptr<
char[]>,
unsigned int);
630 extern template
int UDPHandle::trySend<
IPv6>(
Addr, std::unique_ptr<
char[]>,
unsigned int);
632 extern template
int UDPHandle::trySend<
IPv4>(const sockaddr &,
char *,
unsigned int);
633 extern template
int UDPHandle::trySend<
IPv6>(const sockaddr &,
char *,
unsigned int);
635 extern template
int UDPHandle::trySend<
IPv4>(std::
string,
unsigned int,
char *,
unsigned int);
636 extern template
int UDPHandle::trySend<
IPv6>(std::
string,
unsigned int,
char *,
unsigned int);
658 #endif // UVW_UDP_INCLUDE_H