From 031f9f20e632cc3f06a3ffb037fc5cadc1bef5b1 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Wed, 20 Jul 2016 17:34:53 +0200 Subject: [PATCH] UDP/trySend --- src/uvw/stream.hpp | 16 ++++++++-------- src/uvw/udp.hpp | 26 +++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/uvw/stream.hpp b/src/uvw/stream.hpp index e5fed03d..d2704e70 100644 --- a/src/uvw/stream.hpp +++ b/src/uvw/stream.hpp @@ -119,8 +119,8 @@ public: this->invoke(&uv_read_stop, this->template get()); } - void write(char *data, ssize_t length) { - uv_buf_t bufs[] = { uv_buf_init(data, length) }; + void write(char *data, ssize_t len) { + uv_buf_t bufs[] = { uv_buf_init(data, len) }; std::weak_ptr weak = this->shared_from_this(); auto listener = [weak](const auto &event, details::Write &) { @@ -134,12 +134,12 @@ public: write->write(this->template get(), bufs, 1); } - void write(std::unique_ptr data, ssize_t length) { - write(data.get(), length); + void write(std::unique_ptr data, ssize_t len) { + write(data.get(), len); } - int tryWrite(char *data, ssize_t length) { - uv_buf_t bufs[] = { uv_buf_init(data, length) }; + int tryWrite(char *data, ssize_t len) { + uv_buf_t bufs[] = { uv_buf_init(data, len) }; auto bw = uv_try_write(this->template get(), bufs, 1); if(bw < 0) { @@ -150,8 +150,8 @@ public: return bw; } - int tryWrite(std::unique_ptr data, ssize_t length) { - return tryWrite(data.get(), length); + int tryWrite(std::unique_ptr data, ssize_t len) { + return tryWrite(data.get(), len); } bool readable() const noexcept { diff --git a/src/uvw/udp.hpp b/src/uvw/udp.hpp index e1be6ed5..ca0c5caf 100644 --- a/src/uvw/udp.hpp +++ b/src/uvw/udp.hpp @@ -59,7 +59,7 @@ class Udp final: public Handle { remoteF{&tRemote} { } - static void readCallback(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf, const sockaddr *addr, unsigned flags) { + static void recvCallback(uv_udp_t *handle, ssize_t nread, const uv_buf_t *buf, const sockaddr *addr, unsigned flags) { Udp &udp = *(static_cast(handle->data)); // data will be destroyed no matter of what the value of nread is std::unique_ptr data{buf->base}; @@ -121,9 +121,29 @@ public: void ttl(int val) { invoke(&uv_udp_set_ttl, get(), val > 255 ? 255 : val); } // TODO uv_udp_send - // TODO uv_udp_try_send - void read() { invoke(&uv_udp_recv_start, get(), &allocCallback, &readCallback); } + template> + int trySend(std::string ip, unsigned int port, char *data, ssize_t len) { + typename Traits::Type addr; + Traits::AddrFunc(ip.c_str(), port, &addr); + + uv_buf_t bufs[] = { uv_buf_init(data, len) }; + auto bw = uv_udp_try_send(get(), bufs, 1, reinterpret_cast(&addr)); + + if(bw < 0) { + this->publish(ErrorEvent{bw}); + bw = 0; + } + + return bw; + } + + template> + int trySend(std::string ip, unsigned int port, std::unique_ptr data, ssize_t len) { + return trySend(ip, port, data.get(), len); + } + + void recv() { invoke(&uv_udp_recv_start, get(), &allocCallback, &recvCallback); } void stop() { invoke(&uv_udp_recv_stop, get()); } private: