From 23564ef19f60f51a68918a1a10c6c456c37bfe37 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Wed, 17 Dec 2025 21:59:03 +0100 Subject: [PATCH] Fix: DateVerify causes master program UI blocked --- server/2015Remote/2015RemoteDlg.cpp | 2 +- server/2015Remote/DateVerify.h | 96 +++++++++++++++++++---------- 2 files changed, 64 insertions(+), 34 deletions(-) diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index a0410af..4f389c4 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -1821,7 +1821,7 @@ std::string joinString(const std::vector& tokens, char delimiter) bool CMy2015RemoteDlg::CheckValid(int trail) { - DateVerify verify; + static DateVerify verify; BOOL isTrail = verify.isTrail(trail); if (!isTrail) { diff --git a/server/2015Remote/DateVerify.h b/server/2015Remote/DateVerify.h index e62e8f1..2869be0 100644 --- a/server/2015Remote/DateVerify.h +++ b/server/2015Remote/DateVerify.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include #include @@ -6,7 +6,7 @@ #include #pragma comment(lib, "ws2_32.lib") -// й½ŻNTPб +// 中国大陆优化的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; -// Ƿ +// 检测程序是否处于试用期 class DateVerify { private: - // ʼ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; } - // ָNTPȡʱ + // 从指定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); - // + // 解析主机名 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]); - // óʱ - DWORD timeout = 2000; // 2볬ʱ + // 设置超时 + DWORD timeout = 2000; // 2秒超时 setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)); - // ׼NTP + // 准备NTP请求包 char ntpPacket[48] = { 0 }; ntpPacket[0] = 0x1B; // LI=0, VN=3, Mode=3 - // + // 发送请求 if (sendto(sock, ntpPacket, sizeof(ntpPacket), 0, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { closesocket(sock); return 0; } - // Ӧ + // 接收响应 if (recv(sock, ntpPacket, sizeof(ntpPacket), 0) <= 0) { closesocket(sock); return 0; @@ -71,12 +77,12 @@ private: closesocket(sock); - // NTPʱ + // 解析NTP时间 uint32_t ntpTime = ntohl(*((uint32_t*)(ntpPacket + 40))); return ntpTime - NTP_EPOCH_OFFSET; } - // ȡʱ䣨Զ + // 获取网络时间(尝试多个服务器) time_t getNetworkTimeInChina() { if (!initWinsock()) return 0; @@ -93,7 +99,7 @@ private: return result; } - // ·дתΪ(1-12) + // 将月份缩写转换为数字(1-12) int monthAbbrevToNumber(const std::string& month) { static const std::map months = { @@ -105,7 +111,7 @@ private: return (it != months.end()) ? it->second : 0; } - // __DATE__ַΪtmṹ + // 解析__DATE__字符串为tm结构 tm parseCompileDate(const char* compileDate) { tm tmCompile = { 0 }; @@ -120,7 +126,7 @@ private: return tmCompile; } - // ֮ + // 计算两个日期之间的天数差 int daysBetweenDates(const tm& date1, const tm& date2) { auto timeToTimePoint = [](const tm& tmTime) { @@ -135,7 +141,7 @@ private: return std::chrono::duration_cast(duration).count() / 24; } - // ȡǰ + // 获取当前日期 tm getCurrentDate() { std::time_t now = std::time(nullptr); @@ -146,24 +152,48 @@ private: return tmNow; } - // ֤Ƿ޸ - bool isLocalDateModified() - { - time_t networkTime = getNetworkTimeInChina(); - if (networkTime == 0) { - return true; // ޷֤ - } + // 验证本地日期是否被修改 + 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; - // 1ӳٺʱأ - 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(); - // + // 计算天数差 int daysDiff = daysBetweenDates(tmCompile, tmCurrent); return daysDiff <= trailDays;