UDP/trySend
This commit is contained in:
parent
d0674add3a
commit
031f9f20e6
@ -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 {
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user