Improvement: Prepare for optimization of online capacity

This commit is contained in:
yuanyuanxiang
2025-04-07 18:18:36 +08:00
parent 69afaf19c0
commit 72459de00e
26 changed files with 931 additions and 231 deletions

View File

@@ -34,7 +34,6 @@
#endif
#endif
CRITICAL_SECTION IOCPServer::m_cs = {0};
// <20><><EFBFBD><EFBFBD> socket <20><>ȡ<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>IP<49><50>ַ.
std::string GetRemoteIP(SOCKET sock) {
@@ -64,7 +63,7 @@ IOCPServer::IOCPServer(void)
m_hCompletionPort = NULL;
m_sListenSocket = INVALID_SOCKET;
m_hListenEvent = WSA_INVALID_EVENT;
m_hListenThread = INVALID_HANDLE_VALUE;
m_hListenThread = NULL;
m_ulMaxConnections = ((CMy2015RemoteApp*)AfxGetApp())->m_iniFile.GetInt("settings", "MaxConnection");
@@ -99,38 +98,41 @@ IOCPServer::IOCPServer(void)
#endif
}
IOCPServer::~IOCPServer(void)
{
void IOCPServer::Destroy() {
m_bTimeToKill = TRUE;
Sleep(10);
SetEvent(m_hKillEvent);
Sleep(10);
if (m_hKillEvent!=NULL)
if (m_hKillEvent != NULL)
{
SetEvent(m_hKillEvent);
CloseHandle(m_hKillEvent);
m_hKillEvent = NULL;
}
if (m_sListenSocket!=INVALID_SOCKET)
if (m_sListenSocket != INVALID_SOCKET)
{
closesocket(m_sListenSocket);
m_sListenSocket = INVALID_SOCKET;
}
if (m_hCompletionPort!=INVALID_HANDLE_VALUE)
if (m_hCompletionPort != INVALID_HANDLE_VALUE)
{
CloseHandle(m_hCompletionPort);
m_hCompletionPort = INVALID_HANDLE_VALUE;
}
if (m_hListenEvent!=WSA_INVALID_EVENT)
if (m_hListenEvent != WSA_INVALID_EVENT)
{
CloseHandle(m_hListenEvent);
m_hListenEvent = WSA_INVALID_EVENT;
}
}
IOCPServer::~IOCPServer(void)
{
Destroy();
while (m_ulWorkThreadCount || m_hListenThread)
Sleep(10);
while (!m_ContextConnectionList.IsEmpty())
{
@@ -147,9 +149,6 @@ IOCPServer::~IOCPServer(void)
delete ContextObject;
}
while (m_ulWorkThreadCount)
Sleep(10);
DeleteCriticalSection(&m_cs);
m_ulWorkThreadCount = 0;
@@ -260,7 +259,7 @@ UINT IOCPServer::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, U
(void*)this, //<2F><>Thread<61>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>this <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5>̻߳ص<CCBB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еij<D0B5>Ա
0,
NULL);
if (m_hListenThread==INVALID_HANDLE_VALUE)
if (m_hListenThread==NULL)
{
int a = GetLastError();
closesocket(m_sListenSocket);
@@ -319,7 +318,7 @@ BOOL IOCPServer::InitializeIOCP(VOID)
return FALSE;
}
m_ulWorkThreadCount++;
AddWorkThread(1);
CloseHandle(hWorkThread);
}
@@ -385,7 +384,7 @@ DWORD IOCPServer::WorkThreadProc(LPVOID lParam)
0,
NULL);
InterlockedIncrement(&This->m_ulWorkThreadCount);
This->AddWorkThread(hThread ? 1:0);
CloseHandle(hThread);
}
@@ -406,7 +405,7 @@ DWORD IOCPServer::WorkThreadProc(LPVOID lParam)
}
}
if (!bError)
if (!bError && !This->m_bTimeToKill)
{
if(bOk && OverlappedPlus!=NULL && ContextObject!=NULL)
{
@@ -427,10 +426,12 @@ DWORD IOCPServer::WorkThreadProc(LPVOID lParam)
timeEndPeriod(1);
SAFE_DELETE(OverlappedPlus);
InterlockedDecrement(&This->m_ulWorkThreadCount);
InterlockedDecrement(&This->m_ulCurrentThread);
InterlockedDecrement(&This->m_ulBusyThread);
int n= This->AddWorkThread(-1);
if (n == 0) {
Mprintf("======> IOCPServer All WorkThreadProc done\n");
}
OutputDebugStringA("======> IOCPServer WorkThreadProc end \n");
return 0;
@@ -439,8 +440,6 @@ DWORD IOCPServer::WorkThreadProc(LPVOID lParam)
//<2F>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD>߳<EFBFBD><DFB3>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>
BOOL IOCPServer::HandleIO(IOType PacketFlags,PCONTEXT_OBJECT ContextObject, DWORD dwTrans)
{
AUTO_TICK(20);
BOOL bRet = FALSE;
switch (PacketFlags)
@@ -472,7 +471,6 @@ BOOL IOCPServer::OnClientInitializing(PCONTEXT_OBJECT ContextObject, DWORD dwTr
BOOL IOCPServer::OnClientReceiving(PCONTEXT_OBJECT ContextObject, DWORD dwTrans)
{
CLock cs(m_cs);
try
{
if (dwTrans == 0) //<2F>Է<EFBFBD><D4B7>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>׽<EFBFBD><D7BD><EFBFBD>
@@ -560,7 +558,7 @@ VOID IOCPServer::OnClientPreSending(CONTEXT_OBJECT* ContextObject, PBYTE szBuffe
{
assert (ContextObject);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
if (ulOriginalLength < 100 && szBuffer[0] != COMMAND_SCREEN_CONTROL) {
if (ulOriginalLength < 100 && szBuffer[0] != COMMAND_SCREEN_CONTROL && szBuffer[0] != CMD_HEARTBEAT_ACK) {
char buf[100] = { 0 };
if (ulOriginalLength == 1){
sprintf_s(buf, "command %d", int(szBuffer[0]));
@@ -659,7 +657,7 @@ DWORD IOCPServer::ListenThreadProc(LPVOID lParam) //
IOCPServer* This = (IOCPServer*)(lParam);
WSANETWORKEVENTS NetWorkEvents;
while(1)
while(!This->m_bTimeToKill)
{
if (WaitForSingleObject(This->m_hKillEvent, 100) == WAIT_OBJECT_0)
break;
@@ -686,8 +684,8 @@ DWORD IOCPServer::ListenThreadProc(LPVOID lParam) //
break;
}
}
}
}
This->m_hListenThread = NULL;
return 0;
}
@@ -753,8 +751,9 @@ void IOCPServer::OnAccept()
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߻<EFBFBD><DFBB>ϵ<EFBFBD><CFB5>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SO_KEEPALIVEѡ<45>
//<2F><><EFBFBD><EFBFBD>һֱ<D2BB><D6B1><EFBFBD>ر<EFBFBD>SOCKET<45><54><EFBFBD><EFBFBD>Ϊ<EFBFBD>ϵĵ<CFB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Сʱʱ<CAB1><CAB1>̫<EFBFBD><CCAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
CLock cs(m_cs);
EnterCriticalSection(&m_cs);
m_ContextConnectionList.AddTail(ContextObject); //<2F><><EFBFBD><EFBFBD><EBB5BD><EFBFBD>ǵ<EFBFBD><C7B5>ڴ<EFBFBD><DAB4>б<EFBFBD><D0B1><EFBFBD>
LeaveCriticalSection(&m_cs);
OVERLAPPEDPLUS *OverlappedPlus = new OVERLAPPEDPLUS(IOInitialize); //ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>IO<49><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@@ -816,8 +815,10 @@ PCONTEXT_OBJECT IOCPServer::AllocateContext()
VOID IOCPServer::RemoveStaleContext(CONTEXT_OBJECT* ContextObject)
{
CLock cs(m_cs);
if (m_ContextConnectionList.Find(ContextObject)) //<2F><><EFBFBD>ڴ<EFBFBD><DAB4>в<EFBFBD><D0B2>Ҹ<EFBFBD><D2B8>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ
EnterCriticalSection(&m_cs);
auto find = m_ContextConnectionList.Find(ContextObject);
LeaveCriticalSection(&m_cs);
if (find) //<2F><><EFBFBD>ڴ<EFBFBD><DAB4>в<EFBFBD><D0B2>Ҹ<EFBFBD><D2B8>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ
{
m_OfflineProc(ContextObject);