mirror of
https://github.com/Qv2ray/Qv2ray.git
synced 2025-05-20 10:50:23 +08:00
fix windows build
This commit is contained in:
parent
c84dc794fa
commit
aaff3de0a7
@ -1 +1 @@
|
|||||||
5808
|
5809
|
||||||
|
@ -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
|
||||||
|
@ -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>();
|
||||||
|
@ -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
|
||||||
|
@ -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>();
|
||||||
|
@ -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);
|
||||||
|
@ -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>();
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user