fix windows build

This commit is contained in:
DuckVador 2020-07-25 20:57:36 +08:00
parent c84dc794fa
commit aaff3de0a7
No known key found for this signature in database
GPG Key ID: 9B0DED785B37110E
8 changed files with 136 additions and 142 deletions

View File

@ -1 +1 @@
5808 5809

View File

@ -1,116 +1,130 @@
#pragma once #pragma once
#include "LatencyTest.hpp" #include "LatencyTest.hpp"
#include "coroutine.hpp" #include "coroutine.hpp"
#include "uvw.hpp" #include "uvw.hpp"
namespace Qv2ray::components::latency namespace Qv2ray::components::latency
{ {
template<typename T> template<typename T>
class DNSBase class DNSBase
: public coroutine : public coroutine
, public std::enable_shared_from_this<T> , public std::enable_shared_from_this<T>
{ {
public: public:
DNSBase(const std::shared_ptr<uvw::Loop> &loopin, LatencyTestRequest &req, LatencyTestHost *testHost) DNSBase(const std::shared_ptr<uvw::Loop> &loopin, LatencyTestRequest &req, LatencyTestHost *testHost)
: loop(loopin), req(std::move(req)), testHost(testHost) : loop(loopin), req(std::move(req)), testHost(testHost)
{ {
} }
virtual ~DNSBase(); virtual ~DNSBase();
protected: protected:
template<typename E, typename H> int isAddr()
void async_DNS_lookup(E &&e, H &&h) {
{ auto host = req.host.toStdString();
co_enter(*this) if (uv_ip4_addr(host.data(), req.port, reinterpret_cast<sockaddr_in *>(&storage)) == 0)
{ {
if (getAddrHandle) return AF_INET;
{ }
getAddrHandle->once<uvw::ErrorEvent>(coro(async_DNS_lookup)); if (uv_ip6_addr(host.data(), req.port, reinterpret_cast<sockaddr_in6 *>(&storage)) == 0)
getAddrHandle->once<uvw::AddrInfoEvent>(coro(async_DNS_lookup)); {
co_yield return getAddrHandle->addrInfo(req.host.toStdString(), digitBuffer); return AF_INET6;
co_yield if constexpr (std::is_same_v<uvw::AddrInfoEvent, std::remove_reference_t<E>>) }
{ return -1;
if (getAddrInfoRes(e) != 0) }
{
data.errorMessage = QObject::tr("DNS not resolved"); template<typename E, typename H>
data.avg = LATENCY_TEST_VALUE_ERROR; void async_DNS_lookup(E &&e, H &&h)
testHost->OnLatencyTestCompleted(req.id, data); {
h.clear(); co_enter(*this)
return; {
} if (getAddrHandle)
} {
else getAddrHandle->once<uvw::ErrorEvent>(coro(async_DNS_lookup));
{ getAddrHandle->once<uvw::AddrInfoEvent>(coro(async_DNS_lookup));
if constexpr (std::is_same_v<uvw::ErrorEvent, std::remove_reference_t<E>>) co_yield return getAddrHandle->addrInfo(req.host.toStdString(), digitBuffer);
{ co_yield if constexpr (std::is_same_v<uvw::AddrInfoEvent, std::remove_reference_t<E>>)
data.errorMessage = QObject::tr("DNS not resolved"); {
data.avg = LATENCY_TEST_VALUE_ERROR; if (getAddrInfoRes(e) != 0)
testHost->OnLatencyTestCompleted(req.id, data); {
h.clear(); data.errorMessage = QObject::tr("DNS not resolved");
return; data.avg = LATENCY_TEST_VALUE_ERROR;
} testHost->OnLatencyTestCompleted(req.id, data);
} h.clear();
} return;
} }
ping(); }
if (getAddrHandle) else
getAddrHandle->clear(); {
} if constexpr (std::is_same_v<uvw::ErrorEvent, std::remove_reference_t<E>>)
int getAddrInfoRes(uvw::AddrInfoEvent &e) {
{ data.errorMessage = QObject::tr("DNS not resolved");
struct addrinfo *rp = nullptr; data.avg = LATENCY_TEST_VALUE_ERROR;
for (rp = e.data.get(); rp != nullptr; rp = rp->ai_next) testHost->OnLatencyTestCompleted(req.id, data);
if (rp->ai_family == AF_INET) h.clear();
{ return;
if (rp->ai_family == AF_INET) }
{ }
af = AF_INET; }
memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in)); }
} ping();
else if (rp->ai_family == AF_INET6) if (getAddrHandle)
{ getAddrHandle->clear();
af = AF_INET6; }
memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in6)); int getAddrInfoRes(uvw::AddrInfoEvent &e)
} {
break; struct addrinfo *rp = nullptr;
} for (rp = e.data.get(); rp != nullptr; rp = rp->ai_next)
if (rp == nullptr) if (rp->ai_family == AF_INET)
{ {
// fallback: if we can't find prefered AF, then we choose alternative. if (rp->ai_family == AF_INET)
for (rp = e.data.get(); rp != nullptr; rp = rp->ai_next) {
{ af = AF_INET;
if (rp->ai_family == AF_INET) memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in));
{ }
af = AF_INET; else if (rp->ai_family == AF_INET6)
memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in)); {
} af = AF_INET6;
else if (rp->ai_family == AF_INET6) memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in6));
{ }
af = AF_INET6; break;
memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in6)); }
} if (rp == nullptr)
break; {
} // 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) {
return 0; if (rp->ai_family == AF_INET)
return -1; {
} af = AF_INET;
virtual void ping() = 0; memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in));
}
protected: else if (rp->ai_family == AF_INET6)
int af = AF_INET; {
int successCount = 0; af = AF_INET6;
LatencyTestRequest req; memcpy(&storage, rp->ai_addr, sizeof(struct sockaddr_in6));
LatencyTestResult data; }
LatencyTestHost *testHost; break;
struct sockaddr_storage storage; }
char digitBuffer[20] = { 0 }; }
std::shared_ptr<uvw::Loop> loop; if (rp)
std::shared_ptr<uvw::GetAddrInfoReq> getAddrHandle; return 0;
}; return -1;
template<typename T> }
DNSBase<T>::~DNSBase() virtual void ping() = 0;
{
} protected:
} // namespace Qv2ray::components::latency int af = AF_INET;
int successCount = 0;
LatencyTestRequest req;
LatencyTestResult data;
LatencyTestHost *testHost;
struct sockaddr_storage storage;
char digitBuffer[20] = { 0 };
std::shared_ptr<uvw::Loop> loop;
std::shared_ptr<uvw::GetAddrInfoReq> getAddrHandle;
};
template<typename T>
DNSBase<T>::~DNSBase()
{
}
} // namespace Qv2ray::components::latency

View File

@ -2,22 +2,9 @@
#include "LatencyTestThread.hpp" #include "LatencyTestThread.hpp"
#include "core/handler/ConfigHandler.hpp" #include "core/handler/ConfigHandler.hpp"
#include "uvw.hpp"
namespace Qv2ray::components::latency 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<sockaddr_in *>(storage)) == 0)
{
return AF_INET;
}
if (uv_ip6_addr(host, port, reinterpret_cast<sockaddr_in6 *>(storage)) == 0)
{
return AF_INET6;
}
return -1;
}
LatencyTestHost::LatencyTestHost(const int defaultCount, QObject *parent) : QObject(parent) LatencyTestHost::LatencyTestHost(const int defaultCount, QObject *parent) : QObject(parent)
{ {
qRegisterMetaType<ConnectionId>(); qRegisterMetaType<ConnectionId>();

View File

@ -27,8 +27,6 @@ namespace Qv2ray::components::latency
Qv2rayLatencyTestingMethod method; Qv2rayLatencyTestingMethod method;
}; };
int isAddr(const char *host, int port, struct sockaddr_storage *storage, int ipv6first);
class LatencyTestHost : public QObject class LatencyTestHost : public QObject
{ {
Q_OBJECT Q_OBJECT

View File

@ -36,7 +36,7 @@ namespace Qv2ray::components::latency::tcping
data.failedCount = 0; data.failedCount = 0;
data.worst = 0; data.worst = 0;
data.avg = 0; data.avg = 0;
af = isAddr(req.host.toStdString().data(), req.port, &storage, 0); af = isAddr();
if (af == -1) if (af == -1)
{ {
getAddrHandle = loop->resource<uvw::GetAddrInfoReq>(); getAddrHandle = loop->resource<uvw::GetAddrInfoReq>();

View File

@ -73,7 +73,7 @@ namespace Qv2ray::components::latency::icmping
data.failedCount = 0; data.failedCount = 0;
data.worst = 0; data.worst = 0;
data.avg = 0; data.avg = 0;
if (isAddr(req.host.toStdString().data(), req.port, &storage, 0) == -1) if (isAddr() == -1)
{ {
getAddrHandle = loop->resource<uvw::GetAddrInfoReq>(); getAddrHandle = loop->resource<uvw::GetAddrInfoReq>();
sprintf(digitBuffer, "%d", req.port); sprintf(digitBuffer, "%d", req.port);

View File

@ -11,10 +11,11 @@ typedef struct _IO_STATUS_BLOCK
} IO_STATUS_BLOCK, *PIO_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); typedef VOID(NTAPI *PIO_APC_ROUTINE)(IN PVOID ApcContext, IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved);
#define PIO_APC_ROUTINE_DEFINED #define PIO_APC_ROUTINE_DEFINED
#include <IcmpAPI.h>
#include <WS2tcpip.h> #include <WS2tcpip.h>
#include <Windows.h> #include <Windows.h>
#include <iphlpapi.h> #include <iphlpapi.h>
#include <IcmpAPI.h>
#include <QString>
namespace Qv2ray::components::latency::icmping namespace Qv2ray::components::latency::icmping
{ {
@ -129,7 +130,7 @@ namespace Qv2ray::components::latency::icmping
data.failedCount = 0; data.failedCount = 0;
data.worst = 0; data.worst = 0;
data.avg = 0; data.avg = 0;
af = isAddr(req.host.toStdString().data(), req.port, &storage, 0); af = isAddr();
if (af == -1) if (af == -1)
{ {
getAddrHandle = loop->resource<uvw::GetAddrInfoReq>(); getAddrHandle = loop->resource<uvw::GetAddrInfoReq>();

View File

@ -3,14 +3,8 @@
#include <QtGlobal> #include <QtGlobal>
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
#include "components/latency/LatencyTest.hpp"
#include "../DNSBase.hpp" #include "../DNSBase.hpp"
#include <QPair>
#include <QString>
#include <memory> #include <memory>
#include <optional>
#include <utility>
namespace Qv2ray::components::latency::icmping namespace Qv2ray::components::latency::icmping
{ {