#include "stdafx.h" #include "ClientLogManager.h" #include "../common/commands.h" #include "../common/logger.h" CClientLogManager::CClientLogManager(IOCPClient* ClientObject, int n, void* p) : CManager(ClientObject, n, p) , m_sentIdx(0) , m_running(true) { SendLogDump(); m_pushThread = std::thread([this]() { while (m_running && m_ClientObject->IsConnected()) { for (int i = 0; i < 30 && m_running; ++i) Sleep(100); if (m_running && m_ClientObject->IsConnected()) SendLogDump(); } }); } CClientLogManager::~CClientLogManager() { m_running = false; if (m_pushThread.joinable()) m_pushThread.join(); } VOID CClientLogManager::OnReceive(PBYTE szBuffer, ULONG ulLength) { if (ulLength >= 1 && szBuffer[0] == COMMAND_QUERY_LOG) SendLogDump(); } void CClientLogManager::SendLogDump() { std::lock_guard lock(m_sendMutex); std::string logs = Logger::getInstance().DumpMemoryLogFrom(m_sentIdx); std::vector pkt(1 + logs.size()); pkt[0] = TOKEN_REPORT_LOG; if (!logs.empty()) memcpy(pkt.data() + 1, logs.data(), logs.size()); Send(pkt.data(), (UINT)pkt.size()); }