From 34d3974ebcf19ee97d8f68e29817a94da1b67891 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Wed, 20 Jul 2016 17:51:33 +0200 Subject: [PATCH] Udp/send --- src/uvw/udp.hpp | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/uvw/udp.hpp b/src/uvw/udp.hpp index ca0c5caf..151e3714 100644 --- a/src/uvw/udp.hpp +++ b/src/uvw/udp.hpp @@ -120,7 +120,37 @@ public: void broadcast(bool enable = false) { invoke(&uv_udp_set_broadcast, get(), enable ? 1 : 0); } void ttl(int val) { invoke(&uv_udp_set_ttl, get(), val > 255 ? 255 : val); } - // TODO uv_udp_send + template> + void send(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) }; + std::weak_ptr weak = this->shared_from_this(); + + auto listener = [weak](const auto &event, details::Send &) { + auto ptr = weak.lock(); + + if(ptr) { + ptr->addressF = &tAddress; + ptr->remoteF = &tRemote; + ptr->publish(event); + } + }; + + auto send = this->loop().resource(); + send->once(listener); + send->once(listener); + send->send(get(), bufs, 1, reinterpret_cast(&addr)); + + addressF = &tAddress; + remoteF = &tRemote; + } + + template> + void send(std::string ip, unsigned int port, std::unique_ptr data, ssize_t len) { + send(ip, port, data.get(), len); + } template> int trySend(std::string ip, unsigned int port, char *data, ssize_t len) { @@ -133,6 +163,9 @@ public: if(bw < 0) { this->publish(ErrorEvent{bw}); bw = 0; + } else { + addressF = &tAddress; + remoteF = &tRemote; } return bw;