diff --git a/src/uvw/udp.cpp b/src/uvw/udp.cpp index 5d6e622d..a0692703 100644 --- a/src/uvw/udp.cpp +++ b/src/uvw/udp.cpp @@ -47,11 +47,57 @@ UVW_INLINE void UDPHandle::connect(const sockaddr &addr) { } +template +UVW_INLINE void UDPHandle::connect(std::string ip, unsigned int port) { + typename details::IpTraits::Type addr; + details::IpTraits::addrFunc(ip.data(), port, &addr); + connect(reinterpret_cast(addr)); +} + + +template +UVW_INLINE void UDPHandle::connect(Addr addr) { + connect(std::move(addr.ip), addr.port); +} + + UVW_INLINE void UDPHandle::disconnect() { invoke(&uv_udp_connect, get(), nullptr); } +template +UVW_INLINE Addr UDPHandle::peer() const noexcept { + return details::address(&uv_udp_getpeername, get()); +} + + +template +UVW_INLINE void UDPHandle::bind(std::string ip, unsigned int port, Flags opts) { + typename details::IpTraits::Type addr; + details::IpTraits::addrFunc(ip.data(), port, &addr); + bind(reinterpret_cast(addr), std::move(opts)); +} + + +template +UVW_INLINE void UDPHandle::bind(Addr addr, Flags opts) { + bind(std::move(addr.ip), addr.port, std::move(opts)); +} + + +template +UVW_INLINE Addr UDPHandle::sock() const noexcept { + return details::address(&uv_udp_getsockname, get()); +} + + +template +UVW_INLINE bool UDPHandle::multicastMembership(std::string multicast, std::string iface, Membership membership) { + return (0 == uv_udp_set_membership(get(), multicast.data(), iface.data(), static_cast(membership))); +} + + UVW_INLINE bool UDPHandle::multicastLoop(bool enable) { return (0 == uv_udp_set_multicast_loop(get(), enable)); } @@ -62,6 +108,12 @@ UVW_INLINE bool UDPHandle::multicastTtl(int val) { } +template +UVW_INLINE bool UDPHandle::multicastInterface(std::string iface) { + return (0 == uv_udp_set_multicast_interface(get(), iface.data())); +} + + UVW_INLINE bool UDPHandle::broadcast(bool enable) { return (0 == uv_udp_set_broadcast(get(), enable)); } @@ -88,6 +140,20 @@ UVW_INLINE void UDPHandle::send(const sockaddr &addr, std::unique_ptr da } +template +UVW_INLINE void UDPHandle::send(std::string ip, unsigned int port, std::unique_ptr data, unsigned int len) { + typename details::IpTraits::Type addr; + details::IpTraits::addrFunc(ip.data(), port, &addr); + send(reinterpret_cast(addr), std::move(data), len); +} + + +template +UVW_INLINE void UDPHandle::send(Addr addr, std::unique_ptr data, unsigned int len) { + send(std::move(addr.ip), addr.port, std::move(data), len); +} + + UVW_INLINE void UDPHandle::send(const sockaddr &addr, char *data, unsigned int len) { auto req = loop().resource( std::unique_ptr{data, [](char *) { @@ -103,6 +169,82 @@ UVW_INLINE void UDPHandle::send(const sockaddr &addr, char *data, unsigned int l } +template +UVW_INLINE void UDPHandle::send(std::string ip, unsigned int port, char *data, unsigned int len) { + typename details::IpTraits::Type addr; + details::IpTraits::addrFunc(ip.data(), port, &addr); + send(reinterpret_cast(addr), data, len); +} + + +template +UVW_INLINE void UDPHandle::send(Addr addr, char *data, unsigned int len) { + send(std::move(addr.ip), addr.port, data, len); +} + + +template +UVW_INLINE int UDPHandle::trySend(const sockaddr &addr, std::unique_ptr data, unsigned int len) { + uv_buf_t bufs[] = { uv_buf_init(data.get(), len) }; + auto bw = uv_udp_try_send(get(), bufs, 1, &addr); + + if(bw < 0) { + publish(ErrorEvent{bw}); + bw = 0; + } + + return bw; +} + + +template +UVW_INLINE int UDPHandle::trySend(std::string ip, unsigned int port, std::unique_ptr data, unsigned int len) { + typename details::IpTraits::Type addr; + details::IpTraits::addrFunc(ip.data(), port, &addr); + return trySend(reinterpret_cast(addr), std::move(data), len); +} + + +template +UVW_INLINE int UDPHandle::trySend(Addr addr, std::unique_ptr data, unsigned int len) { + return trySend(std::move(addr.ip), addr.port, std::move(data), len); +} + + +template +UVW_INLINE int UDPHandle::trySend(const sockaddr &addr, char *data, unsigned int len) { + uv_buf_t bufs[] = { uv_buf_init(data, len) }; + auto bw = uv_udp_try_send(get(), bufs, 1, &addr); + + if(bw < 0) { + publish(ErrorEvent{bw}); + bw = 0; + } + + return bw; +} + + +template +UVW_INLINE int UDPHandle::trySend(std::string ip, unsigned int port, char *data, unsigned int len) { + typename details::IpTraits::Type addr; + details::IpTraits::addrFunc(ip.data(), port, &addr); + return trySend(reinterpret_cast(addr), data, len); +} + + +template +UVW_INLINE int UDPHandle::trySend(Addr addr, char *data, unsigned int len) { + return trySend(std::move(addr.ip), addr.port, data, len); +} + + +template +UVW_INLINE void UDPHandle::recv() { + invoke(&uv_udp_recv_start, get(), &allocCallback, &recvCallback); +} + + UVW_INLINE void UDPHandle::stop() { invoke(&uv_udp_recv_stop, get()); } diff --git a/src/uvw/udp.h b/src/uvw/udp.h index e211359b..90e114c5 100644 --- a/src/uvw/udp.h +++ b/src/uvw/udp.h @@ -190,11 +190,7 @@ public: * @param port The port to which to bind. */ template - void connect(std::string ip, unsigned int port) { - typename details::IpTraits::Type addr; - details::IpTraits::addrFunc(ip.data(), port, &addr); - connect(reinterpret_cast(addr)); - } + void connect(std::string ip, unsigned int port); /** * @brief Associates the handle to a remote address and port (either IPv4 or @@ -210,9 +206,7 @@ public: * @param addr A valid instance of Addr. */ template - void connect(Addr addr) { - connect(std::move(addr.ip), addr.port); - } + void connect(Addr addr); /** * @brief Disconnects the handle. @@ -228,9 +222,7 @@ public: * @return A valid instance of Addr, an empty one in case of errors. */ template - Addr peer() const noexcept { - return details::address(&uv_udp_getpeername, get()); - } + Addr peer() const noexcept; /** * @brief Binds the UDP handle to an IP address and port. @@ -251,11 +243,7 @@ public: * @param opts Optional additional flags. */ template - void bind(std::string ip, unsigned int port, Flags opts = Flags{}) { - typename details::IpTraits::Type addr; - details::IpTraits::addrFunc(ip.data(), port, &addr); - bind(reinterpret_cast(addr), std::move(opts)); - } + void bind(std::string ip, unsigned int port, Flags opts = Flags{}); /** * @brief Binds the UDP handle to an IP address and port. @@ -275,18 +263,14 @@ public: * @param opts Optional additional flags. */ template - void bind(Addr addr, Flags opts = Flags{}) { - bind(std::move(addr.ip), addr.port, std::move(opts)); - } + void bind(Addr addr, Flags opts = Flags{}); /** * @brief Get the local IP and port of the UDP handle. * @return A valid instance of Addr, an empty one in case of errors. */ template - Addr sock() const noexcept { - return details::address(&uv_udp_getsockname, get()); - } + Addr sock() const noexcept; /** * @brief Sets membership for a multicast address. @@ -302,9 +286,7 @@ public: * @return True in case of success, false otherwise. */ template - bool multicastMembership(std::string multicast, std::string iface, Membership membership) { - return (0 == uv_udp_set_membership(get(), multicast.data(), iface.data(), static_cast(membership))); - } + bool multicastMembership(std::string multicast, std::string iface, Membership membership); /** * @brief Sets IP multicast loop flag. @@ -329,9 +311,7 @@ public: * @return True in case of success, false otherwise. */ template - bool multicastInterface(std::string iface) { - return (0 == uv_udp_set_multicast_interface(get(), iface.data())); - } + bool multicastInterface(std::string iface); /** * @brief Sets broadcast on or off. @@ -385,11 +365,7 @@ public: * @param len The lenght of the submitted data. */ template - void send(std::string ip, unsigned int port, std::unique_ptr data, unsigned int len) { - typename details::IpTraits::Type addr; - details::IpTraits::addrFunc(ip.data(), port, &addr); - send(reinterpret_cast(addr), std::move(data), len); - } + void send(std::string ip, unsigned int port, std::unique_ptr data, unsigned int len); /** * @brief Sends data over the UDP socket. @@ -409,9 +385,7 @@ public: * @param len The lenght of the submitted data. */ template - void send(Addr addr, std::unique_ptr data, unsigned int len) { - send(std::move(addr.ip), addr.port, std::move(data), len); - } + void send(Addr addr, std::unique_ptr data, unsigned int len); /** * @brief Sends data over the UDP socket. @@ -451,11 +425,7 @@ public: * @param len The lenght of the submitted data. */ template - void send(std::string ip, unsigned int port, char *data, unsigned int len) { - typename details::IpTraits::Type addr; - details::IpTraits::addrFunc(ip.data(), port, &addr); - send(reinterpret_cast(addr), data, len); - } + void send(std::string ip, unsigned int port, char *data, unsigned int len); /** * @brief Sends data over the UDP socket. @@ -475,9 +445,7 @@ public: * @param len The lenght of the submitted data. */ template - void send(Addr addr, char *data, unsigned int len) { - send(std::move(addr.ip), addr.port, data, len); - } + void send(Addr addr, char *data, unsigned int len); /** * @brief Sends data over the UDP socket. @@ -491,17 +459,7 @@ public: * @return Number of bytes written. */ template - int trySend(const sockaddr &addr, std::unique_ptr data, unsigned int len) { - uv_buf_t bufs[] = { uv_buf_init(data.get(), len) }; - auto bw = uv_udp_try_send(get(), bufs, 1, &addr); - - if(bw < 0) { - publish(ErrorEvent{bw}); - bw = 0; - } - - return bw; - } + int trySend(const sockaddr &addr, std::unique_ptr data, unsigned int len); /** * @brief Sends data over the UDP socket. @@ -516,11 +474,7 @@ public: * @return Number of bytes written. */ template - int trySend(std::string ip, unsigned int port, std::unique_ptr data, unsigned int len) { - typename details::IpTraits::Type addr; - details::IpTraits::addrFunc(ip.data(), port, &addr); - return trySend(reinterpret_cast(addr), std::move(data), len); - } + int trySend(std::string ip, unsigned int port, std::unique_ptr data, unsigned int len); /** * @brief Sends data over the UDP socket. @@ -534,9 +488,7 @@ public: * @return Number of bytes written. */ template - int trySend(Addr addr, std::unique_ptr data, unsigned int len) { - return trySend(std::move(addr.ip), addr.port, std::move(data), len); - } + int trySend(Addr addr, std::unique_ptr data, unsigned int len); /** * @brief Sends data over the UDP socket. @@ -550,17 +502,7 @@ public: * @return Number of bytes written. */ template - int trySend(const sockaddr &addr, char *data, unsigned int len) { - uv_buf_t bufs[] = { uv_buf_init(data, len) }; - auto bw = uv_udp_try_send(get(), bufs, 1, &addr); - - if(bw < 0) { - publish(ErrorEvent{bw}); - bw = 0; - } - - return bw; - } + int trySend(const sockaddr &addr, char *data, unsigned int len); /** * @brief Sends data over the UDP socket. @@ -575,11 +517,7 @@ public: * @return Number of bytes written. */ template - int trySend(std::string ip, unsigned int port, char *data, unsigned int len) { - typename details::IpTraits::Type addr; - details::IpTraits::addrFunc(ip.data(), port, &addr); - return trySend(reinterpret_cast(addr), data, len); - } + int trySend(std::string ip, unsigned int port, char *data, unsigned int len); /** * @brief Sends data over the UDP socket. @@ -593,9 +531,7 @@ public: * @return Number of bytes written. */ template - int trySend(Addr addr, char *data, unsigned int len) { - return trySend(std::move(addr.ip), addr.port, data, len); - } + int trySend(Addr addr, char *data, unsigned int len); /** * @brief Prepares for receiving data. @@ -608,9 +544,7 @@ public: * An ErrorEvent event will be emitted in case of errors. */ template - void recv() { - invoke(&uv_udp_recv_start, get(), &allocCallback, &recvCallback); - } + void recv(); /** * @brief Stops listening for incoming datagrams.