UDP/trySend

This commit is contained in:
Michele Caini 2016-07-20 17:34:53 +02:00
parent d0674add3a
commit 031f9f20e6
2 changed files with 31 additions and 11 deletions

View File

@ -119,8 +119,8 @@ public:
this->invoke(&uv_read_stop, this->template get<uv_stream_t>());
}
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<T> weak = this->shared_from_this();
auto listener = [weak](const auto &event, details::Write &) {
@ -134,12 +134,12 @@ public:
write->write(this->template get<uv_stream_t>(), bufs, 1);
}
void write(std::unique_ptr<char[]> data, ssize_t length) {
write(data.get(), length);
void write(std::unique_ptr<char[]> 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<uv_stream_t>(), bufs, 1);
if(bw < 0) {
@ -150,8 +150,8 @@ public:
return bw;
}
int tryWrite(std::unique_ptr<char[]> data, ssize_t length) {
return tryWrite(data.get(), length);
int tryWrite(std::unique_ptr<char[]> data, ssize_t len) {
return tryWrite(data.get(), len);
}
bool readable() const noexcept {

View File

@ -59,7 +59,7 @@ class Udp final: public Handle<Udp> {
remoteF{&tRemote<details::IPv4>}
{ }
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<Udp*>(handle->data));
// data will be destroyed no matter of what the value of nread is
std::unique_ptr<const char[]> data{buf->base};
@ -121,9 +121,29 @@ public:
void ttl(int val) { invoke(&uv_udp_set_ttl, get<uv_udp_t>(), val > 255 ? 255 : val); }
// TODO uv_udp_send
// TODO uv_udp_try_send
void read() { invoke(&uv_udp_recv_start, get<uv_udp_t>(), &allocCallback, &readCallback); }
template<typename I, typename..., typename Traits = details::IpTraits<I>>
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<uv_udp_t>(), bufs, 1, reinterpret_cast<const sockaddr *>(&addr));
if(bw < 0) {
this->publish(ErrorEvent{bw});
bw = 0;
}
return bw;
}
template<typename I, typename..., typename Traits = details::IpTraits<I>>
int trySend(std::string ip, unsigned int port, std::unique_ptr<char[]> data, ssize_t len) {
return trySend<I>(ip, port, data.get(), len);
}
void recv() { invoke(&uv_udp_recv_start, get<uv_udp_t>(), &allocCallback, &recvCallback); }
void stop() { invoke(&uv_udp_recv_stop, get<uv_udp_t>()); }
private: