From aaff3de0a7f0a790866056e4c7c36807f3a21c49 Mon Sep 17 00:00:00 2001 From: DuckVador Date: Sat, 25 Jul 2020 20:57:36 +0800 Subject: [PATCH] fix windows build --- makespec/BUILDVERSION | 2 +- src/components/latency/DNSBase.hpp | 246 ++++++++++++----------- src/components/latency/LatencyTest.cpp | 13 -- src/components/latency/LatencyTest.hpp | 2 - src/components/latency/TCPing.cpp | 2 +- src/components/latency/unix/ICMPPing.cpp | 2 +- src/components/latency/win/ICMPPing.cpp | 5 +- src/components/latency/win/ICMPPing.hpp | 6 - 8 files changed, 136 insertions(+), 142 deletions(-) diff --git a/makespec/BUILDVERSION b/makespec/BUILDVERSION index 27f64406..62f0b842 100644 --- a/makespec/BUILDVERSION +++ b/makespec/BUILDVERSION @@ -1 +1 @@ -5808 +5809 diff --git a/src/components/latency/DNSBase.hpp b/src/components/latency/DNSBase.hpp index 26f88822..af05101b 100644 --- a/src/components/latency/DNSBase.hpp +++ b/src/components/latency/DNSBase.hpp @@ -1,116 +1,130 @@ -#pragma once -#include "LatencyTest.hpp" -#include "coroutine.hpp" -#include "uvw.hpp" - -namespace Qv2ray::components::latency -{ - template - class DNSBase - : public coroutine - , public std::enable_shared_from_this - { - public: - DNSBase(const std::shared_ptr &loopin, LatencyTestRequest &req, LatencyTestHost *testHost) - : loop(loopin), req(std::move(req)), testHost(testHost) - { - } - virtual ~DNSBase(); - - protected: - template - void async_DNS_lookup(E &&e, H &&h) - { - co_enter(*this) - { - if (getAddrHandle) - { - getAddrHandle->once(coro(async_DNS_lookup)); - getAddrHandle->once(coro(async_DNS_lookup)); - co_yield return getAddrHandle->addrInfo(req.host.toStdString(), digitBuffer); - co_yield if constexpr (std::is_same_v>) - { - if (getAddrInfoRes(e) != 0) - { - data.errorMessage = QObject::tr("DNS not resolved"); - data.avg = LATENCY_TEST_VALUE_ERROR; - testHost->OnLatencyTestCompleted(req.id, data); - h.clear(); - return; - } - } - else - { - if constexpr (std::is_same_v>) - { - data.errorMessage = QObject::tr("DNS not resolved"); - data.avg = LATENCY_TEST_VALUE_ERROR; - testHost->OnLatencyTestCompleted(req.id, data); - h.clear(); - return; - } - } - } - } - ping(); - if (getAddrHandle) - getAddrHandle->clear(); - } - int getAddrInfoRes(uvw::AddrInfoEvent &e) - { - struct addrinfo *rp = nullptr; - for (rp = e.data.get(); rp != nullptr; rp = rp->ai_next) - if (rp->ai_family == AF_INET) - { - if (rp->ai_family == AF_INET) - { - af = AF_INET; - memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in)); - } - else if (rp->ai_family == AF_INET6) - { - af = AF_INET6; - memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in6)); - } - break; - } - if (rp == nullptr) - { - // fallback: if we can't find prefered AF, then we choose alternative. - for (rp = e.data.get(); rp != nullptr; rp = rp->ai_next) - { - if (rp->ai_family == AF_INET) - { - af = AF_INET; - memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in)); - } - else if (rp->ai_family == AF_INET6) - { - af = AF_INET6; - memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in6)); - } - break; - } - } - if (rp) - return 0; - return -1; - } - virtual void ping() = 0; - - protected: - int af = AF_INET; - int successCount = 0; - LatencyTestRequest req; - LatencyTestResult data; - LatencyTestHost *testHost; - struct sockaddr_storage storage; - char digitBuffer[20] = { 0 }; - std::shared_ptr loop; - std::shared_ptr getAddrHandle; - }; - template - DNSBase::~DNSBase() - { - } -} // namespace Qv2ray::components::latency +#pragma once +#include "LatencyTest.hpp" +#include "coroutine.hpp" +#include "uvw.hpp" + +namespace Qv2ray::components::latency +{ + template + class DNSBase + : public coroutine + , public std::enable_shared_from_this + { + public: + DNSBase(const std::shared_ptr &loopin, LatencyTestRequest &req, LatencyTestHost *testHost) + : loop(loopin), req(std::move(req)), testHost(testHost) + { + } + virtual ~DNSBase(); + + protected: + int isAddr() + { + auto host = req.host.toStdString(); + if (uv_ip4_addr(host.data(), req.port, reinterpret_cast(&storage)) == 0) + { + return AF_INET; + } + if (uv_ip6_addr(host.data(), req.port, reinterpret_cast(&storage)) == 0) + { + return AF_INET6; + } + return -1; + } + + template + void async_DNS_lookup(E &&e, H &&h) + { + co_enter(*this) + { + if (getAddrHandle) + { + getAddrHandle->once(coro(async_DNS_lookup)); + getAddrHandle->once(coro(async_DNS_lookup)); + co_yield return getAddrHandle->addrInfo(req.host.toStdString(), digitBuffer); + co_yield if constexpr (std::is_same_v>) + { + if (getAddrInfoRes(e) != 0) + { + data.errorMessage = QObject::tr("DNS not resolved"); + data.avg = LATENCY_TEST_VALUE_ERROR; + testHost->OnLatencyTestCompleted(req.id, data); + h.clear(); + return; + } + } + else + { + if constexpr (std::is_same_v>) + { + data.errorMessage = QObject::tr("DNS not resolved"); + data.avg = LATENCY_TEST_VALUE_ERROR; + testHost->OnLatencyTestCompleted(req.id, data); + h.clear(); + return; + } + } + } + } + ping(); + if (getAddrHandle) + getAddrHandle->clear(); + } + int getAddrInfoRes(uvw::AddrInfoEvent &e) + { + struct addrinfo *rp = nullptr; + for (rp = e.data.get(); rp != nullptr; rp = rp->ai_next) + if (rp->ai_family == AF_INET) + { + if (rp->ai_family == AF_INET) + { + af = AF_INET; + memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in)); + } + else if (rp->ai_family == AF_INET6) + { + af = AF_INET6; + memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in6)); + } + break; + } + if (rp == nullptr) + { + // fallback: if we can't find prefered AF, then we choose alternative. + for (rp = e.data.get(); rp != nullptr; rp = rp->ai_next) + { + if (rp->ai_family == AF_INET) + { + af = AF_INET; + memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in)); + } + else if (rp->ai_family == AF_INET6) + { + af = AF_INET6; + memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in6)); + } + break; + } + } + if (rp) + return 0; + return -1; + } + virtual void ping() = 0; + + protected: + int af = AF_INET; + int successCount = 0; + LatencyTestRequest req; + LatencyTestResult data; + LatencyTestHost *testHost; + struct sockaddr_storage storage; + char digitBuffer[20] = { 0 }; + std::shared_ptr loop; + std::shared_ptr getAddrHandle; + }; + template + DNSBase::~DNSBase() + { + } +} // namespace Qv2ray::components::latency diff --git a/src/components/latency/LatencyTest.cpp b/src/components/latency/LatencyTest.cpp index 1b90fb9b..12bb6375 100644 --- a/src/components/latency/LatencyTest.cpp +++ b/src/components/latency/LatencyTest.cpp @@ -2,22 +2,9 @@ #include "LatencyTestThread.hpp" #include "core/handler/ConfigHandler.hpp" -#include "uvw.hpp" namespace Qv2ray::components::latency { - int isAddr(const char *host, int port, struct sockaddr_storage *storage, int ipv6first) - { - if (uv_ip4_addr(host, port, reinterpret_cast(storage)) == 0) - { - return AF_INET; - } - if (uv_ip6_addr(host, port, reinterpret_cast(storage)) == 0) - { - return AF_INET6; - } - return -1; - } LatencyTestHost::LatencyTestHost(const int defaultCount, QObject *parent) : QObject(parent) { qRegisterMetaType(); diff --git a/src/components/latency/LatencyTest.hpp b/src/components/latency/LatencyTest.hpp index 886b68c6..4d8f09ba 100644 --- a/src/components/latency/LatencyTest.hpp +++ b/src/components/latency/LatencyTest.hpp @@ -27,8 +27,6 @@ namespace Qv2ray::components::latency Qv2rayLatencyTestingMethod method; }; - int isAddr(const char *host, int port, struct sockaddr_storage *storage, int ipv6first); - class LatencyTestHost : public QObject { Q_OBJECT diff --git a/src/components/latency/TCPing.cpp b/src/components/latency/TCPing.cpp index c1665a31..8b33d181 100644 --- a/src/components/latency/TCPing.cpp +++ b/src/components/latency/TCPing.cpp @@ -36,7 +36,7 @@ namespace Qv2ray::components::latency::tcping data.failedCount = 0; data.worst = 0; data.avg = 0; - af = isAddr(req.host.toStdString().data(), req.port, &storage, 0); + af = isAddr(); if (af == -1) { getAddrHandle = loop->resource(); diff --git a/src/components/latency/unix/ICMPPing.cpp b/src/components/latency/unix/ICMPPing.cpp index 3a27d4df..01ef5460 100644 --- a/src/components/latency/unix/ICMPPing.cpp +++ b/src/components/latency/unix/ICMPPing.cpp @@ -73,7 +73,7 @@ namespace Qv2ray::components::latency::icmping data.failedCount = 0; data.worst = 0; data.avg = 0; - if (isAddr(req.host.toStdString().data(), req.port, &storage, 0) == -1) + if (isAddr() == -1) { getAddrHandle = loop->resource(); sprintf(digitBuffer, "%d", req.port); diff --git a/src/components/latency/win/ICMPPing.cpp b/src/components/latency/win/ICMPPing.cpp index 7a92cbe2..8b5cd08f 100644 --- a/src/components/latency/win/ICMPPing.cpp +++ b/src/components/latency/win/ICMPPing.cpp @@ -11,10 +11,11 @@ typedef struct _IO_STATUS_BLOCK } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; typedef VOID(NTAPI *PIO_APC_ROUTINE)(IN PVOID ApcContext, IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved); #define PIO_APC_ROUTINE_DEFINED - #include #include #include #include + #include + #include namespace Qv2ray::components::latency::icmping { @@ -129,7 +130,7 @@ namespace Qv2ray::components::latency::icmping data.failedCount = 0; data.worst = 0; data.avg = 0; - af = isAddr(req.host.toStdString().data(), req.port, &storage, 0); + af = isAddr(); if (af == -1) { getAddrHandle = loop->resource(); diff --git a/src/components/latency/win/ICMPPing.hpp b/src/components/latency/win/ICMPPing.hpp index ebd58707..10f2c943 100644 --- a/src/components/latency/win/ICMPPing.hpp +++ b/src/components/latency/win/ICMPPing.hpp @@ -3,14 +3,8 @@ #include #ifdef Q_OS_WIN - #include "components/latency/LatencyTest.hpp" - #include "../DNSBase.hpp" - #include - #include #include - #include - #include namespace Qv2ray::components::latency::icmping {