www.pudn.com > back.rar > serverbase.cpp
//////////////////////////////////////////////////////////////////////////////
//
// Simple Crypt Base Class
//
//////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ServerBase.h"
DWORD WINAPI _Mainthread(LPVOID pVoid)
{
CServerBase* pBase = (CServerBase*)pVoid;
pBase->Process();
return 1;
}
void CConnectManage::OnConnected(int iClient)
{
}
void CConnectManage::OnDisconnected(int iClient)
{
}
CServerManage::CServerManage()
{
}
void CServerManage::OnConnected(int iClient, int nServer)
{
}
void CServerManage::OnDisConnected(int iClient, int nServer)
{
}
CServerBase::CServerBase()
{
}
BOOL CServerBase::ServerStart()
{
_Init();
Init();
return _Start();
}
BOOL CServerBase::_Init()
{
g_SetMsgSize();
g_SetMsgSize_fromClient();
if (!m_ServerManage.Analize_ConnectData()) return FALSE;
return TRUE;
}
BOOL CServerBase::_Start()
{
m_ReadCounts = 0;
m_WriteCounts = 0;
m_ReadBytes = 0;
m_WriteBytes = 0;
m_dwFrames = 0;
m_dwCurTick = 0;
m_dwTickManager_500 = 0;
m_dwTickManager_1000 = 0;
m_dwTickManager_1500 = 0;
m_dwTickManager_2000 = 0;
m_dwTickManager_2500 = 0;
m_dwTickManager_3000 = 0;
if (!g_IOCPNet.Init(NULL,(CIOCPToken*)&m_ConnectManage,(CMultiToken*)&m_ServerManage)) return FALSE;
m_hThread = CreateThread(NULL, 0, _Mainthread , this, CREATE_SUSPENDED , &m_ThreadID); // XBufferÀÇ ³»¿ëÀ» °Ë»öÇÑ´Ù.
SetThreadPriority(m_hThread, THREAD_PRIORITY_ABOVE_NORMAL);
ResumeThread(m_hThread);
if (!g_IOCPNet.StartUp()) return FALSE; // ÇöÀç ¼³Á¤ µÇ¾î ÀÖ´Â ¸ðµç ¾²·¹µå¸¦ µ¹¸°´Ù.
return TRUE;
}
void CServerBase::ServerPing()
{
for (int i = 1 ; i < m_ServerManage.GetTotalServerCount(); i++)
{
if (g_ClientArray[i].IsConnected())
{
if( m_ServerManage.m_nExceptLiveserver != i )
{
SSP_Connection_Check Check;
Check.dwSentTime = m_dwCurTick;
Check.bSent = TRUE;
SendToServer(i,(BYTE*)&Check,sizeof(SSP_Connection_Check));
}
}
}
}
void CServerBase::Process()
{
SReadQueueBuffer_Header* pBuffer = NULL;
BYTE* pMsg = NULL;
while(TRUE)
{
DWORD dwCurTime = GetTickCount();
while ((pBuffer = g_XReadQueue.OutQueue(&pMsg)) != NULL)
{
m_ReadBytes += pBuffer->m_dwSize;
m_ReadCounts ++;
MsgProcess(pBuffer->m_iClient,pMsg);
}
#ifdef STEST
Sleep(1);
#endif
m_dwFrames++;
UserProcess(); //user process
_TickManager(); //tick management
Sleep(0);
}
}
BOOL CServerBase::SendToServer(int nServer,BYTE* pData,int size,BOOL bExtra)
{
//account info ¼¹ö·Î account ÀÎÁõ
if (nServer >= BRAVO_MAX_MULTI_SERVER)
return FALSE;
if (g_ClientArray[nServer].Write(pData,size,bExtra) < 0)
return FALSE;
m_WriteCounts ++;
m_WriteBytes += size;
return TRUE;
}
BOOL CServerBase::SendToClient(int iClient,BYTE* pData,int size,BOOL bExtra)
{
if (IOCP_MAX_CLIENT_ACCPET < iClient)
return FALSE;
if (g_ClientArray[iClient].Write(pData,size,bExtra) < 0)
return FALSE;
m_WriteCounts ++;
m_WriteBytes += size;
return TRUE;
}
void CServerBase::_TickManager()
{
m_dwCurTick = GetTickCount();
if (m_dwTickManager_500 < m_dwCurTick)
{m_dwTickManager_500 = m_dwCurTick + 500;_TickManager_500 ();}
if (m_dwTickManager_1000 < m_dwCurTick)
{m_dwTickManager_1000 = m_dwCurTick + 1000;_TickManager_1000 ();}
if (m_dwTickManager_1500 < m_dwCurTick)
{m_dwTickManager_1500 = m_dwCurTick + 1500;_TickManager_1500 ();}
if (m_dwTickManager_2000 < m_dwCurTick)
{m_dwTickManager_2000 = m_dwCurTick + 2000;_TickManager_2000 ();}
if (m_dwTickManager_2500 < m_dwCurTick)
{m_dwTickManager_2500 = m_dwCurTick + 2500;_TickManager_2500 ();}
if (m_dwTickManager_3000 < m_dwCurTick)
{m_dwTickManager_3000 = m_dwCurTick + 3000;_TickManager_3000 ();}
}
void CServerBase::_TickManager_500()
{
TickManager_500();
}
void CServerBase::_TickManager_1000 ()
{
TickManager_1000();
}
void CServerBase::_TickManager_1500 ()
{
TickManager_1500();
}
void CServerBase::_TickManager_2000 ()
{
ServerPing();
TickManager_2000();
}
void CServerBase::_TickManager_2500 ()
{
TickManager_2500();
}
void CServerBase::_TickManager_3000 ()
{
TickManager_3000();
}