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(); 
}