From adf62e8d2b497acfcad673a7666f79d355d75699 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Wed, 20 Jul 2016 09:24:08 +0200 Subject: [PATCH] address/remote are no longer template functions --- src/uvw/tcp.hpp | 45 ++++++++++++++++++++++++++++++++++++--------- test/main.cpp | 4 ++-- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/uvw/tcp.hpp b/src/uvw/tcp.hpp index bfd7d701..cc70a3e1 100644 --- a/src/uvw/tcp.hpp +++ b/src/uvw/tcp.hpp @@ -40,8 +40,22 @@ public: class Tcp final: public Stream { + using GetNameFunctionType = Addr(*)(Tcp &); + + template + static Addr tAddress(Tcp &tcp) { + return tcp.Stream::address(uv_tcp_getsockname); + } + + template + static Addr tRemote(Tcp &tcp) { + return tcp.Stream::address(uv_tcp_getpeername); + } + explicit Tcp(std::shared_ptr ref) - : Stream{HandleType{}, std::move(ref)} + : Stream{HandleType{}, std::move(ref)}, + addressF{&tAddress}, + remoteF{&tRemote} { } public: @@ -73,7 +87,11 @@ public: void bind(std::string ip, unsigned int port, Flags flags = Flags{}) { typename Traits::Type addr; Traits::AddrFunc(ip.c_str(), port, &addr); - invoke(&uv_tcp_bind, get(), reinterpret_cast(&addr), flags); + + if(0 == invoke(&uv_tcp_bind, get(), reinterpret_cast(&addr), flags)) { + addressF = &tAddress; + remoteF = &tRemote; + } } template> @@ -81,11 +99,8 @@ public: bind(addr.ip, addr.port, flags); } - template> - Addr address() { return Stream::address(uv_tcp_getsockname); } - - template> - Addr remote() { return Stream::address(uv_tcp_getpeername); } + Addr address() { return addressF(*this); } + Addr remote() { return remoteF(*this); } template> void connect(std::string ip, unsigned int port) { @@ -96,7 +111,12 @@ public: auto listener = [weak](const auto &event, details::Connect &) { auto ptr = weak.lock(); - if(ptr) { ptr->publish(event); } + + if(ptr) { + ptr->addressF = &tAddress; + ptr->remoteF = &tRemote; + ptr->publish(event); + } }; auto connect = loop().resource(); @@ -109,8 +129,15 @@ public: void connect(Addr addr) { connect(addr.ip, addr.port); } void accept(Tcp &tcp) { - invoke(&uv_accept, get(), tcp.get()); + if(0 == invoke(&uv_accept, get(), tcp.get())) { + tcp.addressF = addressF; + tcp.remoteF = remoteF; + } } + +private: + GetNameFunctionType addressF; + GetNameFunctionType remoteF; }; diff --git a/test/main.cpp b/test/main.cpp index 1f87e951..4eac3b67 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -30,10 +30,10 @@ void listen(uvw::Loop &loop) { srv.accept(*client); - uvw::Addr local = srv.address(); + uvw::Addr local = srv.address(); std::cout << "local: " << local.ip << " " << local.port << std::endl; - uvw::Addr remote = client->remote(); + uvw::Addr remote = client->remote(); std::cout << "remote: " << remote.ip << " " << remote.port << std::endl; client->on([](const uvw::DataEvent &event, uvw::Tcp &) {