#include "stdafx.h" #include #include "AuthFrame.h" #include // Global SolarSimpleConsole g_Console; #include #include #include // ´ýÇÁ °ü·Ã --------------------------------------------------------------------------------------------------------- void ProcCrashHandling(LPCTSTR stackWalkLog, LPCTSTR dumpFileName) { FILE* fp; SYSTEMTIME systemTime; TCHAR temp[127]; GetLocalTime(&systemTime); sprintf(temp, "%s_CrashLog_%d%02d%02d_%02d%02d%02d.txt", SERVICE_NAME, systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond); fp = fopen(temp, "w"); fprintf(fp, "Dump file path : %s\r\n\r\n", dumpFileName); fprintf(fp, stackWalkLog); fclose(fp); // DumpÀÇ ³»¿ëÀ» ¸ÞÀÏ·Î ¹ß¼ÛÇÑ´Ù. { SMTPClient smtp; if(smtp.Connect("mail.webzen.co.kr") == TRUE) { smtp.MailFrom(SERVICE_NAME, "CrashHandler@webzen.co.kr"); smtp.MailTo("poong@webzen.co.kr"); smtp.MailContents("Crash Report", stackWalkLog); smtp.MailAttachFile(temp); smtp.MailAttachFile((LPTSTR)dumpFileName); smtp.MailSubmit(); } } } LPCTSTR GenerateDmpName() { static char fileName[64]; SYSTEMTIME time; ::GetLocalTime(&time); ::sprintf(fileName, "%s_%d%d%d_%d%d%d.dmp", SERVICE_NAME, time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond); return fileName; } void ErrorHandler(DWORD lastError, char* desc) { SUNLOG(eCRITICAL_LOG, "Error = %d, %s\n", lastError, desc); } bool OnServiceStart() { // ÄܼÖâ ÃʱâÈ­ CONSOLE_DESC cdesc; ZeroMemory(&cdesc, sizeof(cdesc)); cdesc.bUsingConsoleInput = FALSE; cdesc.bUsingRedirect = TRUE; g_Console.Init(&cdesc); AuthFrame* const pAuthFrame = AuthFrame::Instance(); return (TRUE == pAuthFrame->DoInit("./AuthServer.ini", AuthFrame::DoAllocServerSession, AuthFrame::DoFreeServerSession, AuthFrame::DoFreeConnectSession, AuthFrame::DoAllocClient_NotUsed, AuthFrame::DoFreeClient_NotUsed, AuthFrame::DoFreeConnect_NotUsed)); } void OnServiceProcess() { AuthFrame::Instance()->DoProcess(); } bool OnServiceUpdate() { return (TRUE == AuthFrame::Instance()->DoUpdate()); } void OnServiceStop() { AuthFrame::Instance()->DoRelease(); AuthFrame::DestroyInstance(); // ÄܼÖâ Á¾·á g_Console.Release(); } // //extern SolarLog * g_pLoger[LOG_MAX]; int main(int argc, char * argv[]) { SharedMemoryPool::CreateInstance(); //IfNotDebug() { TCHAR fileName[1024]; int len, i; ::GetModuleFileName(0, fileName, 1024); len = (int)::strlen(fileName); for(i = len - 1 ; i >= 0 ; i--) { if(fileName[i] == '\\') break; } fileName[i] = 0; SetCurrentDirectory(fileName); } CrashHandler::Install(true, GenerateDmpName, ProcCrashHandling); /////////////////////////////////////////////////////////////////////////////////////////////////// // For Windows service //IfNotDebug() //{ // char moduleName[1024]; // ::GetModuleFileName(0, moduleName, 1024); // if(argc > 1) // { // ::_tcsupr(argv[1]); // if(::_tcsncmp(argv[1], _T("INSTALL"), 7) == 0) // { // if(argc == 4) // eXtreme::WinService::Instance()->UploadService( // SERVICE_NAME, SERVICE_NAME, moduleName, argv[2], argv[3], true); // else if(argc == 2) // eXtreme::WinService::Instance()->UploadService( // SERVICE_NAME, SERVICE_NAME, moduleName, 0, 0, true); // return 0; // } // else if(::_tcsncmp(argv[1], _T("REMOVE"), 6) == 0) // { // eXtreme::WinService::Instance()->RemoveService(SERVICE_NAME); // return 0; // } // } //} if(eXtreme::Initialize(0, ErrorHandler) == false) { SUNLOG(eCRITICAL_LOG, "Already same server running.\n"); getch(); return 0; } //IfDebug() { OnServiceStart(); OnServiceProcess(); OnServiceStop(); } //else //{ // // ReleaseÀÇ °æ¿ì Background Service·Î µ¿ÀÛÇØ¾ßÇÑ´Ù. // // ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ±â Àü ±îÁö StartDispatcher¿¡¼­ BlockµÈ´Ù. // if(eXtreme::WinService::Instance()->StartDispatcher( // SERVICE_NAME, OnServiceStart, OnServiceStop, OnServiceUpdate) == false) // return 0; //} return 0; }