mirror of
https://github.com/yuanyuanxiang/SimpleRemoter.git
synced 2026-01-21 23:13:08 +08:00
Fix: DateVerify causes master program UI blocked
This commit is contained in:
@@ -1821,7 +1821,7 @@ std::string joinString(const std::vector<std::string>& tokens, char delimiter)
|
||||
|
||||
bool CMy2015RemoteDlg::CheckValid(int trail)
|
||||
{
|
||||
DateVerify verify;
|
||||
static DateVerify verify;
|
||||
BOOL isTrail = verify.isTrail(trail);
|
||||
|
||||
if (!isTrail) {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#pragma once
|
||||
#pragma once
|
||||
|
||||
#include <iostream>
|
||||
#include <ctime>
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <Windows.h>
|
||||
#pragma comment(lib, "ws2_32.lib")
|
||||
|
||||
// <EFBFBD>й<EFBFBD><EFBFBD><EFBFBD>½<EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>NTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
// 中国大陆优化的NTP服务器列表
|
||||
const char* CN_NTP_SERVERS[] = {
|
||||
"ntp.aliyun.com",
|
||||
"time1.aliyun.com",
|
||||
@@ -19,18 +19,24 @@ const int CN_NTP_COUNT = sizeof(CN_NTP_SERVERS) / sizeof(CN_NTP_SERVERS[0]);
|
||||
const int NTP_PORT = 123;
|
||||
const uint64_t NTP_EPOCH_OFFSET = 2208988800ULL;
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 检测程序是否处于试用期
|
||||
class DateVerify
|
||||
{
|
||||
private:
|
||||
// <20><>ʼ<EFBFBD><CABC>Winsock
|
||||
bool m_hasVerified = false;
|
||||
bool m_lastVerifyResult = true;
|
||||
time_t m_lastVerifyLocalTime = 0;
|
||||
time_t m_lastNetworkTime = 0;
|
||||
static const int VERIFY_INTERVAL = 6 * 3600; // 6小时
|
||||
|
||||
// 初始化Winsock
|
||||
bool initWinsock()
|
||||
{
|
||||
WSADATA wsaData;
|
||||
return WSAStartup(MAKEWORD(2, 2), &wsaData) == 0;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>NTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡʱ<EFBFBD><EFBFBD>
|
||||
// 从指定NTP服务器获取时间
|
||||
time_t getTimeFromServer(const char* server)
|
||||
{
|
||||
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||
@@ -40,7 +46,7 @@ private:
|
||||
serverAddr.sin_family = AF_INET;
|
||||
serverAddr.sin_port = htons(NTP_PORT);
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 解析主机名
|
||||
hostent* host = gethostbyname(server);
|
||||
if (!host) {
|
||||
closesocket(sock);
|
||||
@@ -48,22 +54,22 @@ private:
|
||||
}
|
||||
serverAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr_list[0]);
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>ʱ
|
||||
DWORD timeout = 2000; // 2<EFBFBD>볬ʱ
|
||||
// 设置超时
|
||||
DWORD timeout = 2000; // 2秒超时
|
||||
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
|
||||
|
||||
// <EFBFBD><EFBFBD>NTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 准备NTP请求包
|
||||
char ntpPacket[48] = { 0 };
|
||||
ntpPacket[0] = 0x1B; // LI=0, VN=3, Mode=3
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 发送请求
|
||||
if (sendto(sock, ntpPacket, sizeof(ntpPacket), 0,
|
||||
(sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
|
||||
closesocket(sock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
|
||||
// 接收响应
|
||||
if (recv(sock, ntpPacket, sizeof(ntpPacket), 0) <= 0) {
|
||||
closesocket(sock);
|
||||
return 0;
|
||||
@@ -71,12 +77,12 @@ private:
|
||||
|
||||
closesocket(sock);
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>NTPʱ<EFBFBD><EFBFBD>
|
||||
// 解析NTP时间
|
||||
uint32_t ntpTime = ntohl(*((uint32_t*)(ntpPacket + 40)));
|
||||
return ntpTime - NTP_EPOCH_OFFSET;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣨<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 获取网络时间(尝试多个服务器)
|
||||
time_t getNetworkTimeInChina()
|
||||
{
|
||||
if (!initWinsock()) return 0;
|
||||
@@ -93,7 +99,7 @@ private:
|
||||
return result;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>дת<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(1-12)
|
||||
// 将月份缩写转换为数字(1-12)
|
||||
int monthAbbrevToNumber(const std::string& month)
|
||||
{
|
||||
static const std::map<std::string, int> months = {
|
||||
@@ -105,7 +111,7 @@ private:
|
||||
return (it != months.end()) ? it->second : 0;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>__DATE__<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>Ϊtm<EFBFBD>ṹ
|
||||
// 解析__DATE__字符串为tm结构
|
||||
tm parseCompileDate(const char* compileDate)
|
||||
{
|
||||
tm tmCompile = { 0 };
|
||||
@@ -120,7 +126,7 @@ private:
|
||||
return tmCompile;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 计算两个日期之间的天数差
|
||||
int daysBetweenDates(const tm& date1, const tm& date2)
|
||||
{
|
||||
auto timeToTimePoint = [](const tm& tmTime) {
|
||||
@@ -135,7 +141,7 @@ private:
|
||||
return std::chrono::duration_cast<std::chrono::hours>(duration).count() / 24;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 获取当前日期
|
||||
tm getCurrentDate()
|
||||
{
|
||||
std::time_t now = std::time(nullptr);
|
||||
@@ -146,24 +152,48 @@ private:
|
||||
return tmNow;
|
||||
}
|
||||
|
||||
// <EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bool isLocalDateModified()
|
||||
{
|
||||
time_t networkTime = getNetworkTimeInChina();
|
||||
if (networkTime == 0) {
|
||||
return true; // <20><EFBFBD><DEB7><EFBFBD>֤
|
||||
}
|
||||
// 验证本地日期是否被修改
|
||||
bool isLocalDateModified()
|
||||
{
|
||||
time_t currentLocalTime = time(nullptr);
|
||||
|
||||
time_t localTime = time(nullptr);
|
||||
double diffDays = difftime(networkTime, localTime) / 86400.0;
|
||||
// 检查是否可以使用缓存
|
||||
if (m_hasVerified) {
|
||||
time_t localElapsed = currentLocalTime - m_lastVerifyLocalTime;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳٺ<D3B3>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>
|
||||
if (fabs(diffDays) > 1.0) {
|
||||
return true;
|
||||
}
|
||||
// 本地时间在合理范围内前进,使用缓存推算
|
||||
if (localElapsed >= 0 && localElapsed < VERIFY_INTERVAL) {
|
||||
time_t estimatedNetworkTime = m_lastNetworkTime + localElapsed;
|
||||
double diffDays = difftime(estimatedNetworkTime, currentLocalTime) / 86400.0;
|
||||
if (fabs(diffDays) <= 1.0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
// 执行网络验证
|
||||
time_t networkTime = getNetworkTimeInChina();
|
||||
if (networkTime == 0) {
|
||||
// 网络不可用:如果之前验证通过且本地时间没异常,暂时信任
|
||||
if (m_hasVerified && !m_lastVerifyResult) {
|
||||
time_t localElapsed = currentLocalTime - m_lastVerifyLocalTime;
|
||||
if (localElapsed >= -300 && localElapsed < 24 * 3600) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// 更新缓存
|
||||
m_hasVerified = true;
|
||||
m_lastVerifyLocalTime = currentLocalTime;
|
||||
m_lastNetworkTime = networkTime;
|
||||
|
||||
double diffDays = difftime(networkTime, currentLocalTime) / 86400.0;
|
||||
m_lastVerifyResult = fabs(diffDays) > 1.0;
|
||||
|
||||
return m_lastVerifyResult;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
@@ -174,7 +204,7 @@ public:
|
||||
|
||||
tm tmCompile = parseCompileDate(__DATE__), tmCurrent = getCurrentDate();
|
||||
|
||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// 计算天数差
|
||||
int daysDiff = daysBetweenDates(tmCompile, tmCurrent);
|
||||
|
||||
return daysDiff <= trailDays;
|
||||
|
||||
Reference in New Issue
Block a user