Improvement: Prepare for optimization of online capacity
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user