Files
Sun1602/Server/MasterServer/main.cpp
T
2022-10-26 12:25:11 +08:00

194 lines
5.0 KiB
C++

#include "stdafx.h"
#include <SolarSimpleConsole.h>
#include <SolarDump.h>
#include <Sessions/ServerSessionEx.h>
#include <Sessions/ServerSessionManager.h>
#include "MasterServerEx.h"
//==================================================================================================
// @desc 메모리 누수 리포터 사용 여부
#define MEMORY_LEAK_REPORT_FILE "memory_leak_Master.txt"
// @desc 공유된 메모리 누수 출력 파일명
#define MEMORY_LEAK_REPORT_FILE_FOR_SHARED "./memory_leak_Master_shared.txt"
#include "./SharedMemoryLeakReporter.hxx"
//==================================================================================================
//
//
//============================================================
//
extern "C"
{
int WinMainCRTStartup();
}
int SunEntryPoint()
{
SharedMemoryPool::CreateInstance();
return WinMainCRTStartup();
}
//============================================================
// Module Varialbes
static MasterServerEx* s_pMasterServerEx = NULL;
// Global
SolarSimpleConsole g_Console;
MasterServerEx* MasterServerEx::GetMainFrame()
{
return s_pMasterServerEx;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
SolarDump dp;
// 콘솔창 초기화
CONSOLE_DESC cdesc;
ZeroMemory( &cdesc, sizeof(cdesc) );
cdesc.bUsingConsoleInput = FALSE;
cdesc.bUsingRedirect = TRUE;
g_Console.Init( &cdesc );
// 명령 인수 파싱
if( !ParseArguments( (LPTSTR)lpCmdLine ) )
{
DISPMSG( "轟槻꽝鑒!\n" );
system( "pause" );
return 0;
}
DISPMSG( \
"=============================================================================\n" \
" 역迦놓迦뺏 Master 륩蛟!\n" \
"=============================================================================\n");
// 서버 초기화
s_pMasterServerEx = new MasterServerEx();
if( !s_pMasterServerEx->DoInit(
"./MasterServer.ini",
MasterServerEx::CreateServerSideAcceptedObject,
MasterServerEx::DestroyServerSideAcceptedObject,
MasterServerEx::DestroyServerSideConnectedObject,
MasterServerEx::CreateServerSideAcceptedObject,
MasterServerEx::DestroyServerSideAcceptedObject,
MasterServerEx::DestroyServerSideConnectedObject
/*NULL,
NULL,
NULL*/
) )
{
DISPMSG( "[WinMain] 륩蛟놓迦뺏呵겨!\n" );
system( "pause" );
return 0;
}
MessageOut( eFULL_LOG, "============================================================================= " );
MessageOut( eFULL_LOG, " SUN Online Master 놓迦뺏供냥." );
MessageOut( eFULL_LOG, "============================================================================= " );
//
// <RUNNING>
s_pMasterServerEx->DoProcess();
s_pMasterServerEx->DoRelease();
// ServerFrame을 상속하면서 생긴문제 해결 목적
// Release이후의 새로운 Instance 를 생성하는 것들은 따로 여기서 해제하기로 한다.
s_pMasterServerEx->Finalize();
SAFE_DELETE(s_pMasterServerEx);
// 서버 종료
DISPMSG( "[WinMain] 륩蛟포綠老岺...\n" );
// 콘솔창 종료
g_Console.Release();
return 0;
}
//
//
//
ServerSession* MasterServerEx::Handler_AllocServerSession( eSERVER_TYPE serverType )
{
ServerSession* pServerSession = (ServerSession*)Handler_AllocServerSession_NoInit( serverType );
if( pServerSession )
{
pServerSession->Init( s_pMasterServerEx );
}
return pServerSession;
}
VOID MasterServerEx::Handler_FreeServerSession( ServerSession* pServerSession )
{
if( pServerSession )
{
pServerSession->Release();
Handler_FreeServerSession_NoRelease( pServerSession );
}
}
NetworkObject* MasterServerEx::Handler_AllocServerSession_NoInit( eSERVER_TYPE serverType )
{
NetworkObject* pSession =
(NetworkObject*)ServerSessionManager::AllocNewSession( serverType );
if( !pSession )
{
MessageOut( eCRITICAL_LOG, "[ServerSessionFactory::AllocServerSession] 잘못된 서버 타입이다. 풀에서 할당할 수 없습니다." );
}
return pSession;
}
VOID MasterServerEx::Handler_FreeServerSession_NoRelease( NetworkObject* pNetworkObject )
{
if( !pNetworkObject )
{
MessageOut( eCRITICAL_LOG, "NULL로 ServerSession 해제하려고 한다." );
return;
}
ServerSession* pServerSession = (ServerSession*)pNetworkObject;
if( !ServerSessionManager::FreeSession( pServerSession ) )
{
MessageOut( eFULL_LOG, "[ServerSessionFactory::FreeServerSession] 잘못된 타입의 서버세션을 Free할 수 없다" );
}
}
///------------------------------------------------------------------------------------------------
/// 서버쪽 콜백
NetworkObject* MasterServerEx::CreateServerSideAcceptedObject()
{
ServerSessionEx* pServerSession =
(ServerSessionEx*)MasterServerEx::Handler_AllocServerSession_NoInit( TEMP_SERVER );
((ServerSession*)pServerSession)->Init( s_pMasterServerEx );
return (NetworkObject*)pServerSession;
}
VOID MasterServerEx::DestroyServerSideAcceptedObject( NetworkObject* pNetworkObject )
{
MasterServerEx::Handler_FreeServerSession( (ServerSession*)pNetworkObject );
}
VOID MasterServerEx::DestroyServerSideConnectedObject( NetworkObject* pNetworkObject )
{
__UNUSED(pNetworkObject);
}