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

270 lines
7.5 KiB
C++

#include "stdafx.h"
#include <Stackwalker.h>
#include <SolarSimpleConsole.h>
#include <SolarDump.h>
#include "WebStruct.h"
#include <AgentServer.h>
#include <UserSessions/UserManager.h>
#include "CSockLi.h" //xiaomi 警속WEB溝퐕
#include "PacketStruct_AG.h"
//==================================================================================================
// @desc 메모리 누수 리포터 사용 여부
#define MEMORY_LEAK_REPORT_FILE "memory_leak_Agent.txt"
// @desc 공유된 메모리 누수 출력 파일명
#define MEMORY_LEAK_REPORT_FILE_FOR_SHARED "./memory_leak_Agent_shared.txt"
#include "./SharedMemoryLeakReporter.hxx"
//==================================================================================================
//===============================================================================================
// <FUNCTION><PROTOTYPEs>
extern VOID CallBackCommand(CHAR *szMessage);
VOID ErrorMsg_n_Pause(CHAR *errmsg);
static VOID _Init_Routine();
extern "C"
{
int WinMainCRTStartup();
}
//===============================================================================================
// <MODULE><VARIABLEs>
static SolarSimpleConsole *s_pConsole = NULL;
//===============================================================================================
// <ENTRY POINT>
int SunEntryPoint()
{
// SharedMemoryPool::CreateInstance();
#ifdef __WAVERIX_TEST_LOGIC_TASK_MACRO__
WaverixTestEntry();
#endif
return WinMainCRTStartup();
}
#ifdef _NA_007743_20141027_USE_MINIDUMP_WITH_FULLMEMORY
static SolarDump solarDUMP(".", MiniDumpWithFullMemory);
#else // _NA_007743_20141027_USE_MINIDUMP_WITH_FULLMEMORY
static SolarDump solarDUMP(".");
#endif // _NA_007743_20141027_USE_MINIDUMP_WITH_FULLMEMORY
void ClientPro(void *p)
{
const char *p1 = "Welcome to connect";
CSockLi *pSock = (CSockLi *)p;
CSockLi socka = *pSock;
socka.Send(p1, strlen(p1));
MSG_CG_ITEM_WEB_DELETE_ACK msg;
//삿혤와빵똥斤口
char sIp[20];
UINT nPort;
socka.GetPeerName(sIp, nPort);
char str[2048];
ZeroMemory(str, 2048);
PacketHeader header;
PacketDeleteItem deleteChar;
AgentServer *agentServer = AgentServer::GetInstance();
/*SlotItem deleteItem;
deleteChar.charGuid = 5601;
deleteChar.iPacketSize = 10;
deleteChar.sCategory = 1;
deleteItem.Dura = 1;
deleteItem.ItemCode = 1502;
deleteItem.SlotIdx = 50;
deleteChar.item[0] = deleteItem;
DISPMSG(" charGuid: %d PacketAddr:%x size:%d\n",deleteChar.charGuid,&deleteChar,sizeof(PacketDeleteItem));*/
while (true)
{
int n = socka.Receive(str, sizeof(str));
if(n == 0){
DISPMSG("붲_B쌈 recv result:%d\n",n);
break;
}
memcpy(&header, str, sizeof(header));
switch (header.sCategory)
{
case WEB_DELETE_EQU:
ZeroMemory(&deleteChar, sizeof(deleteChar));
memcpy(&deleteChar, str, sizeof(deleteChar));
DISPMSG(" charGuid: %d ItemCode:%d size:%d\n", deleteChar.charGuid, deleteChar.item[0].ItemCode, sizeof(deleteChar));
msg.m_dwKey = deleteChar.charGuid;
for (int i = 0; i < deleteChar.itemSize; i++)
{
msg.m_ItemCode = deleteChar.item[i].ItemCode;
msg.m_PortalPos = deleteChar.item[i].SlotIdx;
msg.m_Dura = deleteChar.item[i].Dura;
agentServer->SendToServerByIndex(FIELD_SERVER, &msg, sizeof(msg));
}
break;
default:
DISPMSG("Invaild Packet %d\n", header.sCategory);
break;
}
}
}
DWORD WINAPI webSocket(LPVOID) // xiaomi 警속web溝퐕
{
//눼쉔敬쌈俚
CSockLi sock;
//똥왯8233 IP뒈囹槨127.0.0.1(굶샙IP)
if (!sock.Create(8233, SOCK_STREAM, "127.0.0.1"))
{
DISPMSG("꼻쉔WEB륩꾎포呵뵡\n");
return -1;
}
DISPMSG("꼻쉔WEB륩꾎포냥묘\n");
//삿혤굶샙斤口
char sSevIp[20];
UINT nSevPort;
sock.GetSockName(sSevIp, nSevPort);
//솰桂
sock.Listen(5);
//삿혤와빵똥斤口
char sIp[20]; //와빵똥IP뒈囹
UINT nPort; //와빵똥똥왯
CSockLi socka; //와빵똥敬쌈俚뚤蹶
while (true)
{
sock.Accept(socka, sIp, &nPort);
DISPMSG("唐와묛속흙!\n");
//뜩窟넋,옵谿珂뇹잿뜩몸와빵똥돨젯쌈
_beginthread(ClientPro, 0, &socka);
}
return 0;
}
// <ENTRY POINT><2nd>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
__UNUSED((hInstance, hPrevInstance, lpCmdLine, nCmdShow));
// CoInitializeEx( NULL, COINIT_MULTITHREADED );
// CoInitialize( NULL );
StartMemoryLeakCheck();
BreakPointOnMemoryLeak(63);
#ifdef _DEBUG
// InitAllocCheck();//Memory Leak Check Start
#endif
_Init_Routine();
// 명령 인수 파싱
if (!ParseArguments((LPTSTR)lpCmdLine))
ErrorMsg_n_Pause("轟槻돨꽝鑒!\n");
DISPMSG(
"=============================================================================\n"
" 역迦놓迦뺏덜잿륩蛟똥!\n"
"=============================================================================\n");
WAVERIX_WRAPPER((WAVERIX_LC_CALL0("waverix_log_fasttest")));
// 서버 초기화
AgentServer *agent_server = AgentServer::CreateInstance();
if (!agent_server->DoInit(
AGENT_SERVER_INFO_FILE_NAME,
AgentServer::CreateServerSideAcceptedObject,
AgentServer::DestroyServerSideAcceptedObject,
AgentServer::DestroyServerSideConnectedObject,
AgentServer::CreateClientSideAcceptedObject,
AgentServer::DestroyClientSideAcceptedObject,
AgentServer::DestroyClientSideConnectedObject
/*NULL,
NULL,
NULL*/
))
ErrorMsg_n_Pause("[WinMain] 륩蛟놓迦뺏呵겨!\n");
MessageOut(eFULL_LOG, "============================================================================= ");
MessageOut(eFULL_LOG, " SUN Online 덜잿륩蛟똥놓迦뺏供냥.");
MessageOut(eFULL_LOG, "============================================================================= ");
CreateThread(NULL, 0, webSocket, NULL, NULL, 0); // xiaomi 警속WEB 溝퐕
//
// <RUNNING>
agent_server->DoProcess();
agent_server->DoRelease();
agent_server->DoFinalize();
// ServerFrame을 상속하면서 생긴문제 해결 목적
// Release이후의 새로운 Instance 를 생성하는 것들은 따로 여기서 해제하기로 한다.
// s_pAgentServer->Finalize();
AgentServer::DestroyInstance();
// 서버 종료
DISPMSG("[WinMain] Server is Terminated...\n");
// 콘솔창 종료
s_pConsole->Release();
SAFE_DELETE(s_pConsole);
#ifdef _DEBUG
// DeInitAllocCheck();//Memory Leak Check End
#endif
return 0;
}
static VOID ErrorHandler_new()
{
printf("코닸롸토呵겨\n");
if (g_pSunLog)
{
MessageOut(eCRITICAL_LOG, _T("코닸롸토呵겨\n"));
g_pSunLog->Flush(CSunLog::cOUTPUT_BOTH);
}
__debugbreak();
}
#ifdef __NA000000_080317_ABNORMAL_EXIT_REDIRECT__
#include <signal.h>
VOID signal_redirect(INT signo)
{
__debugbreak();
}
#endif
static VOID _Init_Routine()
{
#ifdef __NA000000_080317_ABNORMAL_EXIT_REDIRECT__
signal(SIGABRT, signal_redirect);
_set_error_mode(_OUT_TO_STDERR);
#endif
std::set_new_handler(ErrorHandler_new);
// 콘솔창 초기화
CONSOLE_DESC cdesc;
ZeroMemory(&cdesc, sizeof(cdesc));
cdesc.bUsingConsoleInput = TRUE;
cdesc.bUsingRedirect = TRUE;
s_pConsole = new SolarSimpleConsole;
s_pConsole->Init(&cdesc);
}
VOID ErrorMsg_n_Pause(CHAR *errmsg)
{
DISPMSG(errmsg);
system("pause");
__debugbreak();
}