From 44d8625687af33f66b16f9af1158031714220c0e Mon Sep 17 00:00:00 2001 From: Bob Chen Date: Mon, 25 Sep 2023 17:31:32 +0800 Subject: [PATCH] a --- net/test/test-ipv6.cpp | 17 +++++++++++++++++ net/utils.cpp | 25 +++++++++++++++++++++++++ net/utils.h | 20 ++++++++++++-------- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/net/test/test-ipv6.cpp b/net/test/test-ipv6.cpp index 35850eda..16fc5a56 100644 --- a/net/test/test-ipv6.cpp +++ b/net/test/test-ipv6.cpp @@ -1,8 +1,10 @@ +#include #include #include #include #include +#include #include TEST(ipv6, addr) { @@ -32,6 +34,21 @@ TEST(ipv6, addr) { EXPECT_TRUE(b.is_link_local()); } +TEST(ipv6, get_host_by_peer) { + auto peer = photon::net::gethostbypeer(photon::net::IPAddr("2001:4860:4860::8888")); + ASSERT_TRUE(!peer.empty()); + ASSERT_TRUE(!peer.is_ipv4()); + LOG_INFO(peer); +} + +TEST(ipv6, dns_lookup) { + std::vector ret; + int num = photon::net::gethostbyname("github.com", ret, true); + ASSERT_TRUE(num >= 1); + ASSERT_TRUE(!ret[0].is_ipv4()); + LOG_INFO(ret[0]); +} + class DualStackTest : public ::testing::Test { public: void run() { diff --git a/net/utils.cpp b/net/utils.cpp index cbe02ca9..8c276e98 100644 --- a/net/utils.cpp +++ b/net/utils.cpp @@ -100,6 +100,31 @@ int _gethostbyname(const char *name, Delegate append_op) { return idx; } +int _gethostbyname_ipv6(const char* name, Delegate append_op) { + int idx = 0; + addrinfo* result = nullptr; + addrinfo* cur = nullptr; + addrinfo hints = {}; + hints.ai_socktype = SOCK_STREAM; + hints.ai_flags = AI_PASSIVE; + hints.ai_family = AF_INET6; + + if (getaddrinfo(name, nullptr, &hints, &result) != 0) { + return -1; + } + for (cur = result; cur != nullptr; cur = cur->ai_next) { + if (cur->ai_family == AF_INET6) { + auto sock_addr = (sockaddr_in6*) cur->ai_addr; + if (append_op(IPAddr(sock_addr->sin6_addr)) < 0) { + break; + } + idx++; + } + } + freeaddrinfo(result); + return idx; +} + inline __attribute__((always_inline)) void base64_translate_3to4(const char *in, char *out) { struct xlator { unsigned char _; diff --git a/net/utils.h b/net/utils.h index 452944dc..62d77ef6 100644 --- a/net/utils.h +++ b/net/utils.h @@ -58,6 +58,7 @@ IPAddr gethostbypeer(const char* domain); // Callback returns -1 means break int _gethostbyname(const char* name, Callback append_op); +int _gethostbyname_ipv6(const char* name, Callback append_op); // inline implemention for compatible @@ -69,13 +70,16 @@ int _gethostbyname(const char* name, Callback append_op); * @param name Host name to resolve * @return first resolved address. */ - inline IPAddr gethostbyname(const char* name) { + inline IPAddr gethostbyname(const char* name, bool ip_v6 = false) { IPAddr ret; auto cb = [&](IPAddr addr) { ret = addr; return -1; }; - _gethostbyname(name, cb); + if (ip_v6) + _gethostbyname_ipv6(name, cb); + else + _gethostbyname(name, cb); return ret; } @@ -88,15 +92,15 @@ int _gethostbyname(const char* name, Callback append_op); * @param name Host name to resolve * @param buf IPAddr buffer pointer * @param bufsize size of `buf`, takes `sizeof(IPAddr)` as unit - * @return sum of resolved address number. result will be filled into `buf` + * @return sum of resolved address number. -1 means error. result will be filled into `buf` */ -inline int gethostbyname(const char* name, IPAddr* buf, int bufsize = 1) { +inline int gethostbyname(const char* name, IPAddr* buf, int bufsize = 1, bool ip_v6 = false) { int i = 0; auto cb = [&](IPAddr addr) { if (i < bufsize) buf[i++] = addr; return 0; }; - return _gethostbyname(name, cb); + return ip_v6 ? _gethostbyname_ipv6(name, cb) : _gethostbyname(name, cb); } /** @@ -107,15 +111,15 @@ inline int gethostbyname(const char* name, IPAddr* buf, int bufsize = 1) { * * @param name Host name to resolve * @param ret `std::vector` reference to get results - * @return sum of resolved address number. + * @return sum of resolved address number. -1 means error. */ -inline int gethostbyname(const char* name, std::vector& ret) { +inline int gethostbyname(const char* name, std::vector& ret, bool ip_v6 = false) { ret.clear(); auto cb = [&](IPAddr addr) { ret.push_back(addr); return 0; }; - return _gethostbyname(name, cb); + return ip_v6 ? _gethostbyname_ipv6(name, cb) : _gethostbyname(name, cb); } /**