/*********************************************************************** 交易: CLIENT_LOGIN 功能:远程监控客户端连接主监控时调用 输入参数: iHostID(客户端主机ID, 对应WF_HOSTINFO.HOST_ID) --客户端守护进程启动时建议默认根据hostname取ID sSysUserName(Unix 用户名) 返回值: iLogID(登录ID; -1登录失败) sMsg(错误信息. 当iLogID == -1时有效) ----------------------------------------------------------------------*/ void CLIENT_LOGIN(TPSVCINFO *rqst) { TParseBuff ParaList; char *sQqstBuf; sQqstBuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); int iLen = rqst->len; memcpy(sQqstBuf, rqst->data, iLen); sQqstBuf[iLen] = 0; TrimHeadNull(sQqstBuf,iLen); int iRet = ParaList.parseBuff(sQqstBuf); if (!iRet){ ParaList.reset(); ParaList.setLogID(-1); //输入参数不合法,登录失败 ParaList.addMsg("登录主监控守护时输入参数不合法!"); ParaList.getBuiltStr(sQqstBuf); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } //lock the signal. LockSafe(g_pShmTable->m_iClientLock,0); g_pShmTable->ClientReqInfo.m_iHostID = ParaList.getHostID(); ParaList.getSysUserName(g_pShmTable->ClientReqInfo.m_sSysUserName); g_pShmTable->ClientReqInfo.m_iStatus = REQ_CLIENT_LOGIN; ParaList.reset(); int iTimeOut = 0; while(g_pShmTable->ClientReqInfo.m_iStatus == REQ_CLIENT_LOGIN) { //wait... usleep(USLEEP_LONG); if (iTimeOut++ > TIME_OUT) { ParaList.setLogID(-1); //time out,failed ParaList.addMsg("登录主监控超时!"); ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } } //主守护进程处理后的状态可能有: //SERVER_ACCEPT MAX_CLIENT_NUM SERVER_REJECT if (g_pShmTable->ClientReqInfo.m_iStatus == SERVER_ACCEPT){ ParaList.setLogID(g_pShmTable->ClientReqInfo.m_iIndex); } else if (g_pShmTable->ClientReqInfo.m_iStatus == MAX_CLIENT_NUM) { ParaList.setLogID(-1); ParaList.addMsg("远程守护监控连接达到最大限制!"); } else { ParaList.setLogID(-1); ParaList.addMsg(g_pShmTable->ClientReqInfo.m_sMsgBuf); } ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); }
//Overrides the interation method void ASafeInteract::OnInteraction_Implementation(AFirstPersonCharacter* Character) { if (!bIsActive) return; Super::OnInteraction_Implementation(Character); if (IsLocked) { CharacterReference = Character; EnteringCombination = !EnteringCombination; if (EnteringCombination) Fade = 1.0; else Fade = -1.0; } else { UAudioComponent* SpeakerAudio2 = SafeUnlockSpeaker->GetAudioComponent(); SpeakerAudio2->Play(); UnlockSafe(); } }
void ASafeInteract::Tick(float DeltaTime) { APlayerController* c = GetWorld()->GetFirstPlayerController(); if (!c) return; ACharacterHUD* h = Cast<ACharacterHUD>(c->GetHUD()); if (!h) return; if (EnteringCombination) { if ((this->GetActorLocation() - CharacterReference->GetActorLocation()).Size() > 400.0f) { EnteringCombination = false; Fade = -1.0; } h->DrawSafeString = true; FString string = TestCombination; if (CombinationLength < COMBINATION_LENGTH) { string += "_"; for (int i = 0; i < (COMBINATION_LENGTH - CombinationLength) - 1; i++) { string += " "; } } h->SafeString = string; if (CheckInput()) { UAudioComponent* SpeakerAudio = SafeSpeaker->GetAudioComponent(); UAudioComponent* SpeakerAudio2 = SafeUnlockSpeaker->GetAudioComponent(); if (EnterCombination()) { EnteringCombination = false; h->DrawSafeString = false; h->SafeString = ""; SpeakerAudio2->Play(); IsLocked = false; UnlockSafe(); Fade = -1.0; } else { if (!SpeakerAudio->IsPlaying()) SpeakerAudio->Play(); } } } else { h->DrawSafeString = false; h->SafeString = ""; } if (Fade != 0) { h->BlackBackgroundAlpha = FMath::Clamp(h->BlackBackgroundAlpha + (200 * DeltaTime * Fade), 0.0f, 150.0f); if (h->BlackBackgroundAlpha == 0.0f || h->BlackBackgroundAlpha == 150) Fade = 0; } }
/*********************************************************************** 交易: SEND_REMOTEMSG 功能:远程监控发送一个应用程序状态和输出信息到主监控 输入参数: iLogID(登录ID) iHostID(主机ID) iProecessID iProcessCnt cState(进程状态) iMainGuardIndex <sMsg=str_msg>... 返回值: iResult(0-失败, 1-成功) ----------------------------------------------------------------------*/ void SEND_REMOTEMSG(TPSVCINFO *rqst) { TParseBuff ParaList; char *sQqstBuf; sQqstBuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); int iLen = rqst->len; memcpy(sQqstBuf, rqst->data, iLen); sQqstBuf[iLen] = 0; TrimHeadNull(sQqstBuf,iLen); int iRet = ParaList.parseBuff(sQqstBuf); if (!iRet){ ParaList.reset(); ParaList.setResult(0); //输入参数不合法 ParaList.addMsg("输入参数不合法!"); ParaList.getBuiltStr(sQqstBuf); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } //lock the signal. LockSafe(g_pShmTable->m_iClientLock,0); g_pShmTable->ClientReqInfo.m_iHostID = ParaList.getHostID(); g_pShmTable->ClientReqInfo.m_iIndex = ParaList.getLogID(); //g_pShmTable->ClientReqInfo.m_cState = ParaList.getState(); //strcpy(g_pShmTable->ClientReqInfo.m_sMsgBuf,ParaList.getBuiltMsg()); strcpy(g_pShmTable->ClientReqInfo.m_sMsgBuf,sQqstBuf); g_pShmTable->ClientReqInfo.m_iStatus = REQ_SEND_REMOTEMSG; ParaList.reset(); int iTimeOut = 0; while(g_pShmTable->ClientReqInfo.m_iStatus == REQ_SEND_REMOTEMSG) { //wait... usleep(USLEEP_LONG); if (iTimeOut++ > TIME_OUT) { ParaList.setResult(0); //time out,failed ParaList.addMsg("输出消息超时!"); ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } } //主守护进程处理后的状态可能有: // CLIENT_LOG_DEAD REMOTEMSG_SENT if (g_pShmTable->ClientReqInfo.m_iStatus == REMOTEMSG_SENT) { ParaList.setResult(1); } else if (g_pShmTable->ClientReqInfo.m_iStatus == CLIENT_LOG_DEAD) { ParaList.setResult(0); ParaList.addMsg("client log dead."); } else { ParaList.setResult(0); ParaList.addMsg("Failed. Unknown reason."); } ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); }
/*********************************************************************** 交易: ACK_COMMAND 功能:返回指令执行后的结果信息(在GET_COMMAND后调用) 输入参数: iLogID(登录ID) iHostID(主机ID) iProcessID(指令操作的进程ID) iOperation(指令动作) (1-start, 2-stop, 3-ChangeStatus, 4-Refresh) iResult(0-失败, 1-成功) 指令的执行情况 sMsg(指令执行返回的文本信息) 返回值: iResult(0-失败, 1-成功) 交易的执行情况 //iMainGuardIndex(当指令为启动指令时,标识远程应用进程在主监控守护主机AppInfo中的下标) sMsg (失败原因) ----------------------------------------------------------------------*/ void ACK_COMMAND(TPSVCINFO *rqst) { TParseBuff ParaList; char *sQqstBuf; sQqstBuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); int iLen = rqst->len; memcpy(sQqstBuf, rqst->data, iLen); sQqstBuf[iLen] = 0; TrimHeadNull(sQqstBuf,iLen); int iRet = ParaList.parseBuff(sQqstBuf); if (!iRet){ ParaList.reset(); ParaList.setResult(0); //输入参数不合法 ParaList.addMsg("输入参数不合法!"); ParaList.getBuiltStr(sQqstBuf); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } //lock the signal. LockSafe(g_pShmTable->m_iClientLock,0); g_pShmTable->ClientReqInfo.m_iHostID = ParaList.getHostID(); g_pShmTable->ClientReqInfo.m_iIndex = ParaList.getLogID(); g_pShmTable->ClientReqInfo.m_iProcessID = ParaList.getProcessID(); g_pShmTable->ClientReqInfo.m_iResult = ParaList.getResult(); g_pShmTable->ClientReqInfo.m_iOperation = ParaList.getOperation(); strcpy(g_pShmTable->ClientReqInfo.m_sMsgBuf,ParaList.getMsg()); g_pShmTable->ClientReqInfo.m_iStatus = REQ_ACK_COMMAND; ParaList.reset(); int iTimeOut = 0; while(g_pShmTable->ClientReqInfo.m_iStatus == REQ_ACK_COMMAND) { //wait... usleep(USLEEP_LONG); if (iTimeOut++ > TIME_OUT) { ParaList.setResult(0); //time out,failed ParaList.addMsg("返回指令执行结果超时!"); ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } } //主守护进程处理后的状态可能有: // CLIENT_LOG_DEAD ACK_COMMAND_END if (g_pShmTable->ClientReqInfo.m_iStatus == ACK_COMMAND_END) { ParaList.setResult(1); //ParaList.setMainGuardIndex(g_pShmTable->ClientReqInfo.m_iMainGuardIndex); //ParaList.addMsg("已获取到iMainGuardIndex"); } else if (g_pShmTable->ClientReqInfo.m_iStatus == CLIENT_LOG_DEAD) { ParaList.setResult(0); ParaList.addMsg("client log dead."); } else { ParaList.setResult(0); ParaList.addMsg("Failed. Unknown reason."); } ParaList.getBuiltStr(sQqstBuf); TWfLog::log(0,"server_client send ACK_COMMAND_END msg:%s",sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); }
/*********************************************************************** 交易: GET_COMMAND 功能:远程监控客户端获取其需要执行的指令时调用 输入参数: iLogID(登录ID) iHostID(主机ID) 返回值: iResult (0-失败, 1-有操作指令, 2-当前无指令) iOperation (1-start, 2-stop, 3-ChangeStatus, 4-Refresh) iProcessID (指令操作的进程号) iStaffID iPlanID cState sMsg (iResult=0时存放失败信息; ) ----------------------------------------------------------------------*/ void GET_COMMAND(TPSVCINFO *rqst) { TParseBuff ParaList; char *sQqstBuf; sQqstBuf = tpalloc("STRING",NULL,MAX_CMAMSG_LEN); int iLen = rqst->len; memcpy(sQqstBuf, rqst->data, iLen); sQqstBuf[iLen] = 0; TrimHeadNull(sQqstBuf,iLen); DEFINE_QUERY(qry); qry.commit(); qry.close(); int iRet = ParaList.parseBuff(sQqstBuf); if (!iRet){ ParaList.reset(); ParaList.setResult(0); ParaList.addMsg("输入参数不合法!"); ParaList.getBuiltStr(sQqstBuf); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } //lock signal LockSafe(g_pShmTable->m_iClientLock,0); g_pShmTable->ClientReqInfo.m_iHostID = ParaList.getHostID(); g_pShmTable->ClientReqInfo.m_iIndex = ParaList.getLogID(); g_pShmTable->ClientReqInfo.m_iStatus = REQ_GET_COMMAND; ParaList.reset(); int iTimeOut = 0; while(g_pShmTable->ClientReqInfo.m_iStatus == REQ_GET_COMMAND) { //wait... usleep(USLEEP_LONG); if (iTimeOut++ > TIME_OUT) { ParaList.setResult(0); //time out ParaList.addMsg("获取指令超时!"); ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); } } //主守护进程处理后的状态可能有: //REQ_COMMAND_RECV CLIENT_LOG_DEAD REQ_NO_COMMAND if (g_pShmTable->ClientReqInfo.m_iStatus == REQ_COMMAND_RECV){ ParaList.setResult(1); ParaList.setOperation(g_pShmTable->ClientReqInfo.m_iOperation); ParaList.setProcessID(g_pShmTable->ClientReqInfo.m_iProcessID); ParaList.setStaffID(g_pShmTable->ClientReqInfo.m_iStaffID); ParaList.setPlanID(g_pShmTable->ClientReqInfo.m_iPlanID); ParaList.setState(g_pShmTable->ClientReqInfo.m_cState); } else if (g_pShmTable->ClientReqInfo.m_iStatus == CLIENT_LOG_DEAD){ ParaList.setResult(0); ParaList.addMsg("Err: CLIENT_LOG_DEAD"); } else if (g_pShmTable->ClientReqInfo.m_iStatus == REQ_NO_COMMAND){ ParaList.setResult(2); } else { ParaList.setResult(0); ParaList.addMsg("Err: Unknown reason."); } ParaList.getBuiltStr(sQqstBuf); UnlockSafe(g_pShmTable->m_iClientLock,0); tpreturn(TPSUCCESS,0L,sQqstBuf,strlen(sQqstBuf),0L); }