Files
git 9cb257e7ae Add GameClients drops and keep current 1602 source work.
CN1602 is the local client. KR is the official tree with unpacked Data, System, and Sound. Packed .wpk files stay off git.
2026-08-30 23:24:31 +03: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] Master Server init failed!\n" );
system( "pause" );
return 0;
}
MessageOut( eFULL_LOG, "============================================================================= " );
MessageOut( eFULL_LOG, " SUN Online Master Initialization Complete." );
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);
}