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_RECVMMSG = UV_UDP_RECVMMSG
55 enum class UVMembership: std::underlying_type_t<uv_membership> {
56 LEAVE_GROUP = UV_LEAVE_GROUP,
57 JOIN_GROUP = UV_JOIN_GROUP
61 class SendReq final:
public Request<SendReq, uv_udp_send_t> {
63 using Deleter = void(*)(
char *);
65 SendReq(ConstructorAccess ca, std::shared_ptr<Loop> loop, std::unique_ptr<
char[], Deleter> dt,
unsigned int len);
67 void send(uv_udp_t *handle,
const struct sockaddr* addr);
70 std::unique_ptr<char[], Deleter>
data;
96 static void recvCallback(uv_udp_t *handle, ssize_t nread,
const uv_buf_t *buf,
const sockaddr *addr,
unsigned flags) {
97 const typename details::IpTraits<I>::Type *aptr =
reinterpret_cast<const typename details::IpTraits<I>::Type *
>(addr);
101 std::unique_ptr<char[]>
data{buf->base};
105 udp.publish(
UDPDataEvent{details::address<I>(aptr), std::move(
data),
static_cast<std::size_t
>(nread), !(0 == (flags & UV_UDP_PARTIAL))});
106 }
else if(nread == 0 && addr ==
nullptr) {
108 }
else if(nread == 0 && addr !=
nullptr) {
110 udp.publish(
UDPDataEvent{details::address<I>(aptr), std::move(
data),
static_cast<std::size_t
>(nread),
false});
118 using Membership = details::UVMembership;
119 using Bind = details::UVUDPFlags;
123 explicit UDPHandle(ConstructorAccess ca, std::shared_ptr<Loop> ref,
unsigned int f = {});
195 template<
typename I = IPv4>
196 void connect(std::string ip,
unsigned int port);
211 template<
typename I = IPv4>
227 template<
typename I = IPv4>
250 template<typename I =
IPv4>
272 template<
typename I = IPv4>
279 template<
typename I = IPv4>
295 template<typename I =
IPv4>
320 template<typename I =
IPv4>
354 void send(const sockaddr &addr, std::unique_ptr<
char[]>
data,
unsigned int len);
374 template<typename I =
IPv4>
375 void send(std::
string ip,
unsigned int port, std::unique_ptr<
char[]>
data,
unsigned int len);
394 template<typename I =
IPv4>
414 void send(const sockaddr &addr,
char *
data,
unsigned int len);
434 template<typename I =
IPv4>
435 void send(std::
string ip,
unsigned int port,
char *
data,
unsigned int len);
454 template<typename I =
IPv4>
468 template<typename I =
IPv4>
469 int trySend(const sockaddr &addr, std::unique_ptr<
char[]>
data,
unsigned int len);
483 template<typename I =
IPv4>
484 int trySend(std::
string ip,
unsigned int port, std::unique_ptr<
char[]>
data,
unsigned int len);
497 template<typename I =
IPv4>
511 template<typename I =
IPv4>
526 template<typename I =
IPv4>
527 int trySend(std::
string ip,
unsigned int port,
char *
data,
unsigned int len);
540 template<typename I =
IPv4>
553 template<typename I =
IPv4>
577 enum { DEFAULT, FLAGS } tag{DEFAULT};
578 unsigned int flags{};
590 extern template void UDPHandle::connect<IPv4>(std::string,
unsigned int);
591 extern template void UDPHandle::connect<IPv6>(std::string,
unsigned int);
593 extern template void UDPHandle::connect<IPv4>(Addr);
594 extern template void UDPHandle::connect<IPv6>(Addr);
596 extern template Addr UDPHandle::peer<IPv4>() const noexcept;
597 extern template Addr UDPHandle::peer<IPv6>() const noexcept;
599 extern template
void UDPHandle::bind<IPv4>(std::
string,
unsigned int, Flags<Bind>);
600 extern template
void UDPHandle::bind<IPv6>(std::
string,
unsigned int, Flags<Bind>);
602 extern template
void UDPHandle::bind<IPv4>(Addr, Flags<Bind>);
603 extern template
void UDPHandle::bind<IPv6>(Addr, Flags<Bind>);
605 extern template Addr UDPHandle::sock<IPv4>() const noexcept;
606 extern template Addr UDPHandle::sock<IPv6>() const noexcept;
608 extern template
bool UDPHandle::multicastMembership<IPv4>(std::
string, std::
string, Membership);
609 extern template
bool UDPHandle::multicastMembership<IPv6>(std::
string, std::
string, Membership);
611 extern template
bool UDPHandle::multicastInterface<IPv4>(std::
string);
612 extern template
bool UDPHandle::multicastInterface<IPv6>(std::
string);
614 extern template
void UDPHandle::send<IPv4>(std::
string,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
615 extern template
void UDPHandle::send<IPv6>(std::
string,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
617 extern template
void UDPHandle::send<IPv4>(Addr, std::unique_ptr<
char[]>,
unsigned int);
618 extern template
void UDPHandle::send<IPv6>(Addr, std::unique_ptr<
char[]>,
unsigned int);
620 extern template
void UDPHandle::send<IPv4>(std::
string,
unsigned int,
char *,
unsigned int);
621 extern template
void UDPHandle::send<IPv6>(std::
string,
unsigned int,
char *,
unsigned int);
623 extern template
void UDPHandle::send<IPv4>(Addr,
char *,
unsigned int);
624 extern template
void UDPHandle::send<IPv6>(Addr,
char *,
unsigned int);
626 extern template
int UDPHandle::trySend<IPv4>(const sockaddr &, std::unique_ptr<
char[]>,
unsigned int);
627 extern template
int UDPHandle::trySend<IPv6>(const sockaddr &, std::unique_ptr<
char[]>,
unsigned int);
629 extern template
int UDPHandle::trySend<IPv4>(std::
string,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
630 extern template
int UDPHandle::trySend<IPv6>(std::
string,
unsigned int, std::unique_ptr<
char[]>,
unsigned int);
632 extern template
int UDPHandle::trySend<IPv4>(Addr, std::unique_ptr<
char[]>,
unsigned int);
633 extern template
int UDPHandle::trySend<IPv6>(Addr, std::unique_ptr<
char[]>,
unsigned int);
635 extern template
int UDPHandle::trySend<IPv4>(const sockaddr &,
char *,
unsigned int);
636 extern template
int UDPHandle::trySend<IPv6>(const sockaddr &,
char *,
unsigned int);
638 extern template
int UDPHandle::trySend<IPv4>(std::
string,
unsigned int,
char *,
unsigned int);
639 extern template
int UDPHandle::trySend<IPv6>(std::
string,
unsigned int,
char *,
unsigned int);
641 extern template
int UDPHandle::trySend<IPv4>(Addr,
char *,
unsigned int);
642 extern template
int UDPHandle::trySend<IPv6>(Addr,
char *,
unsigned int);
644 extern template
void UDPHandle::recv<IPv4>();
645 extern template
void UDPHandle::recv<IPv6>();
661 #endif // UVW_UDP_INCLUDE_H