// Include #include "gamesrv.h" // Local definitions #pragma warning( disable: 4127 ) #define COMPANY_CODE "EYAP" #define LEN_USER_CC 4 #define pgGame_Start 0x00000001 // °ÔÀÓ ½ÃÀÛ #define pgGame_End 0x00000002 // °ÔÀÓ Á¾·á #define pgServer_Alive 0x00000003 // ¼­¹ö È®ÀÎ #define pgServer_Reset 0x00000004 // ¼­¹ö ÃʱâÈ­ #define pgUser_Alert 0x00000005 // »ç¿ëÀÚ ¾Ë¸² #define pgUser_Sync 0x00000006 // »ç¿ëÀÚ È®ÀÎ #define pgBilling_Auth 0x00000008 // °ú±ÝÀÎÁõ #define pgClient_Move 0x0000000A // »ç¿ëÀÚ °ÔÀÓ¼­¹ö À̵¿ #define pgServer_Conn 0x0000000C // ¼­¹ö¿¬°á struct _PACKET_GAME { long Packet_Type; // ÆÐŶ ŸÀÔ long Packet_Result; // 󸮰á°ú°ª char Game_Server[ 32 ]; // °ÔÀÓ¼­¹öÀÇ ¿¬°á ID char Session[ 32 ]; // GUID char User_CC[ 4 ]; // ±¸ºÐÄÚµå(Company Code) char User_No[ 20 ]; // »ç¿ëÀÚ ¹øÈ£³ª ÁֹιøÈ£ char User_ID[ 40 ]; // »ç¿ëÀÚ ¾ÆÀ̵ð char User_IP[ 24 ]; // »ç¿ëÀÚ Á¢¼Ó ¾ÆÀÌÇÇ char User_Gender; // »ç¿ëÀÚ ¼ºº° - 'M'³²¼º/'F','W'¿©¼º,'C'¹ýÀÎ,'X'È®ÀεÇÁö ¾ÊÀ½ char User_Status[ 3 ]; // »ó¿ëÀÚ »óÅ - 'HO'°³ÀÎ/'PC'°ÔÀÓ¹æ/'SP'ISP/'PM'ÇÁ¸®¹Ì¾ö char User_PayType[ 4 ]; // °áÁ¦ ¼ö´Ü long User_Age; // »ç¿ëÀÚ ³ªÀÌ long Game_No; // °ÔÀÓ¹øÈ£(°ú±ÝDB¿¡ µî·ÏµÈ¹øÈ£) char Bill_PayType[ 2 ]; // ÁöºÒ¹æ½Ä - 'AO'ÈĺÒ/'DO'Á÷ºÒ/'PO'¼±ºÒ char Bill_Method[ 2 ]; // °ú±Ý¹æ½Ä - 'FM,FW' ¿ùÁ¤¾×, ÁÖ¸» ¿ùÁ¤¾×/'FD,DB,HB' ÀÏÁ¤¾×, ±â°£Á¤¾×/'TX' ÄÚÀÎÁ¤¾×/'TB' Á¾·® char Bill_Expire[ 12 ]; // °ú±ÝÁ¾·áÀÏ YYYMMDD long Bill_Remain; // ³²Àº ½Ã°£ ¹× Æ÷ÀÎÆ® }; /*-- _PACKET_GAME ¸Þ¼¼Áö Á¤ÀÇ sendMsg->Packet_Type = htonl( 0 ); sendMsg->Packet_Result = htonl( 0 ); strcpy( sendMsg->Game_Server, "" ); strcpy( sendMsg->Session, "" ); strcpy( sendMsg->User_CC, "" ); strcpy( sendMsg->User_No, "" ); strcpy( sendMsg->User_ID, "" ); strcpy( sendMsg->User_IP, "" ); sendMsg->User_Gender; strcpy( sendMsg->User_Status, "" ); strcpy( sendMsg->User_PayType, "" ); sendMsg->User_Age = htonl( 0 ); sendMsg->Game_No = htonl( 0 ); strcpy( sendMsg->Bill_PayType, "" ); strcpy( sendMsg->Bill_Method, "" ); strcpy( sendMsg->Bill_Expire, "" ); sendMsg->Bill_Remain = htonl( 0 ); */ // Global data cBillConnector* cBillConnector::mBillConnector = NULL; // cBillConnector Constructor cBillConnector::cBillConnector(void) { mBillConnector = this; } // ~cBillConnector Destructor cBillConnector::~cBillConnector(void) { mBillConnector = NULL; } // Initialize Method bool cBillConnector::Initialize(char* ipAddr, unsigned short port, unsigned short numWorkerThreads, unsigned int bufferLength) { return cIocpClient::Initialize( ipAddr, port, numWorkerThreads, bufferLength ); } // Shutdown Method void cBillConnector::Shutdown(DWORD maxWait) { Sleep( 1000 ); cIocpClient::Shutdown( maxWait ); } // PostServerEvent Method bool cBillConnector::PostServerEvent(LPCTSTR format, ...) { cSender* sender = g_gameSrv->GetSender( ); bool retvalue = false; if ( sender != NULL ) { LPVOID msgBuf = NULL; DWORD bufferLength; va_list args; va_start( args, format ); bufferLength = _vscprintf( format, args ) + 1; msgBuf = malloc( bufferLength ); vsprintf( (char*)msgBuf, format, args ); va_end( args ); if ( msgBuf != NULL ) { retvalue = sender->PostServerEvent( (char*)msgBuf ); free( msgBuf ); } } return retvalue; } // PacketResultAuth Method void cBillConnector::PacketResultAuth(long result) { char buffer[260] = { 0, }; switch ( result ) { case 0: // ÀÎÁõ¼º°ø sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Success", result ); break; case 2: // DB¿¡ Á¢±Ù ÇÒ ¼ö ¾øÀ½. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 3: // ³×Æ®¿öÅ©¿¡ ¿À·ù ¹ß»ý. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Network Error has occurred", result ); break; case 10: // ÀÎÁõÁ¤º¸ ¾øÀ½. °áÁ¦ Á¤º¸°¡ DB¿¡ ¾øÀ½. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-You have insufficient points to play. Please top up.", result ); break; case 11: // ÀÜ¾× ºÎÁ·. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-You have insufficient points to play. Please top up.", result ); break; case 12: // ¼¼¼ÇÀÌ ¾ø½¿. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 17: // Áߺ¹°ÔÀÓ »ç¿ëÀÚ. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-You have already connected another game.", result ); break; case 18: // ºÒ¹ý »ç¿ëÀÚ. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-You are illegal user.", result ); break; case 20: // Á¤ÀÇ µÇÁö ¾ÊÀº ÆÐŶ. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 25: // COM ¿¡·¯ sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 26: // ÁöÁ¤µÈ ½Ã°£µ¿¾È(30ÃÊ) ÀÀ´äÀÌ ¾øÀ½. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 27: // ºô¸µ DB¼­¹ö·ÎÀÇ Connect ½ÇÆÐ. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 30: // ÆÐŶ¿¡ ÀÖ´Â °ÔÀÓ ¹øÈ£¿Í ºô¸µ ¼­¹ö¿¡ µî·ÏµÈ °ÔÀÓ ¹øÈ£°¡ ´Ù¸§. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 31: // ºô¸µ ¾îÄ«¿îÆ®ÀÇ ¼­ºñ½º ¸ðµâ ¿¡·¯. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 33: // ÇØ´ç°ÔÀÓÀÇ ±¸¸ÅÁ¤º¸ ¾øÀ½. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-You have insufficient points to play. Please top up.", result ); break; case 35: // °úµµÇÑ ÀÎÁõ ó¸® ¿ä±¸¿¡ ÀÇÇØ Áö±ÝÀº ÀÎÁõ ó¸® ºÒ°¡. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 100: // Á¤ÀÇ µÇÁö ¾ÊÀº ¿À·ù. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 200: // IP¸¦ È®ÀÎ ÇÏ´Â Áß COM ¿¡·¯°¡ ¹ß»ý. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 201: // ÇØ´ç IP¸¦ º¸À¯ÇÑ °ø±ÞÀÚÀÇ Á¤º¸°¡ ºÎÁ·. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 210: // ÀÎÁõ ۸¦ È®ÀÎÇÏ´Â Áß COM ¿¡·¯°¡ ¹ß»ý. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 211: // ÀÎÁõ ۸¦ ãÁö ¸øÇÔ. sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; case 301: // ¾Ë·ÁÁöÁö ¾ÊÀº ¿À·ù sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Billing Error", result ); break; default: // ¾Ë¼ö¾ø´Â ¿À·ù sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Unknown Error", result ); break; } if ( !(result == 0 || result == 301) ) { PostServerEvent( buffer ); } if ( g_verbose ) { printf( "%s\n", buffer ); } } // PacketResultAlert Method void cBillConnector::PacketResultAlert(long result) { char buffer[260] = { 0, }; switch ( result ) { case 1: // »ç¿ëÀÚÀÇ ³²Àº ½Ã°£(ÃÊ ´ÜÀ§) sprintf( buffer, "RT->ACCT::Packet_Result(%d)", result ); break; case 0: // ³²Àº½Ã°£ ¾øÀ½ sprintf( buffer, "RT->ACCT::Packet_Result(%d)", result ); break; case -1: // ȯºÒ sprintf( buffer, "RT->ACCT::Packet_Result(%d)", result ); break; case -2: // Áߺ¹ ·Î±×ÀÎ sprintf( buffer, "RT->ACCT::Packet_Result(%d)-You are disconnected due to double login from other PC", result ); break; case -3: // ¿¹¾àµÇ¾î ÀÖ´ø °áÁ¦ Á¤º¸ »ç¿ë ½ÃÀÛ sprintf( buffer, "RT->ACCT::Packet_Result(%d)", result ); break; case -4: // ±âŸ °­Á¦ Á¾·á sprintf( buffer, "RT->ACCT::Packet_Result(%d)", result ); break; default: // ¾Ë¼ö¾ø´Â ¿À·ù sprintf( buffer, "RT->ACCT::Packet_Result(%d)-Unknown Error", result ); break; } if ( !(result == 1 || result == -3) ) { PostServerEvent( buffer ); } if ( g_verbose ) { printf( "%s\n", buffer ); } } // RecvComplete Method bool cBillConnector::RecvComplete(ULONG_PTR completionKey, PerIoContext* perIoContext, DWORD bytesTransferred) { cCSLock lock( &mCs ); cGameProcess* gameProcess = g_gameSrv->GetGameProcess( ); // ¿ÀÇÁ¼ÂÀÇ Å©±â¸¦ ´©ÀûÇÑ´Ù. perIoContext->offset += bytesTransferred; DWORD packetSize = sizeof(_PACKET_GAME); DWORD length = perIoContext->offset; // ¼ö½ÅµÈ ´©Àû¹öÆÛÀÇ Å©±â DWORD offset = 0; // ¼ö½ÅµÈ ´©Àû¹öÆÛÀÇ ¿ÀÇÁ¼Â while ( length >= packetSize ) { _PACKET_GAME* packet = (_PACKET_GAME*)(perIoContext->buffer + offset); packet->Packet_Type = ntohl( packet->Packet_Type ); packet->Packet_Result = ntohl( packet->Packet_Result ); packet->User_Age = ntohl( packet->User_Age ); packet->Game_No = ntohl( packet->Game_No ); packet->Bill_Remain = ntohl( packet->Bill_Remain ); packet->User_CC;// ±¸ºÐÄÚµå // Packet Type °Ë»ç. switch ( packet->Packet_Type ) { case pgGame_Start: /*-- ¼³¸í »ç¿ëÀÚ°¡ °ÔÀÓ ¼­¹ö¿¡ Á¢¼ÓÇÏ¿´À» ¶§ °ÔÀÓÀ» ½ÃÀÛÇØµµ µÇ´ÂÁö ºô¸µ¼­¹ö¿¡ È®ÀÎ ÀÎÁõ °á°ú°¡ ¼º°øÀÌ¸é ºô¸µ¼­¹ö¿¡¼­ »ç¿ë·® °è»êÀ» ½ÃÀÛ (Á¾·á À̺¥Æ®±îÁö) */ /*-- °ÔÀÓ ¼­¹ö ÀÛ¾÷ °á°ú°ªÀÌ ¼º°øÀÌ¸é °ÔÀÓÀ» ½ÃÀÛ, ½ÇÆÐÀÎ °æ¿ì Ŭ¶óÀÌ¾ðÆ®¿¡°Ô °á°ú°ª Àü¼ÛÈÄ °ÔÀÓ Á¾·á */ PacketResultAuth( packet->Packet_Result ); if ( packet->Packet_Result == 0 ) { if ( gameProcess != NULL ) { gameProcess->Pg_Game_Start( packet->Session, packet->User_ID, packet->User_Status, packet->Bill_Method, packet->Bill_Expire, packet->Bill_Remain ); } } break; // case pgGame_End: break; // ¼Û½ÅÀü¿ë case pgServer_Alive: // Echo ServerAlive( ); if ( g_verbose == true ) { printf( "RT->ACCT::Packet_Type=Server_Alive\n" ); } break; // case pgServer_Reset: break; // ¼Û½ÅÀü¿ë case pgUser_Alert: // ¼ö½ÅÀü¿ë /*-- ¼³¸í Bill_Method = FM/FW/FD/TX ÀÎ °æ¿ì °ÔÀÓÁ¾·á 24½Ã°£ ÀüºÎÅÍ ¸Å 1½Ã°£¸¶´Ù Àü¼Û Á¾·á 1½Ã°£ ÀüºÎÅÍ ¸Å 10ºÐ¸¶´Ù Àü¼Û, Á¾·á 10ºÐÀüºÎÅÍ ¸Å 1ºÐ¸¶´Ù Àü¼Û Bill_Method = DB/HB ÀÎ °æ¿ì °ÔÀÓÀÌ Á¾·áµÇ±â 5ºÐÀüºÎÅÍ 1ºÐ¿¡ Çѹø¾¿ Àü¼Û ¿¹¾à ±¸¸Å¸¦ ÇÏ¿©µµ ¸Þ¼¼Â¡Àº °è¼ÓµÇ¸ç, ¿¹¾à±¸¸Å ¿©ºÎ¸¦ È®ÀÎÇÑ ½ÃÁ¡¿¡¼­ »õ·Î ±¸¸ÅµÈ °áÁ¦³»¿ªÀ» ¸Þ¼¼Â¡ */ /*-- °ÔÀÓ ¼­¹ö ÀÛ¾÷ ºô¸µ¼­¹ö¿¡¼­ ¹ÞÀº Á¤º¸¸¦ ¹ÙÅÁÀ¸·Î »ç¿ëÀÚ¿¡°Ô ¾Ë¸² °ÔÀÓ¼­¹ö¿¡¼­ Packet_Result°¡ 1°ú -3ÀÌ ¾Æ´Ñ °æ¿ì »ç¿ëÀÚ¸¦ °­Á¦Á¾·á(0x00000002 Á¾·á ÆÐŶ Àü¼Û ¾ÈÇÔ) */ PacketResultAlert( packet->Packet_Result ); if ( gameProcess != NULL ) { gameProcess->Pg_User_Alert( packet->Packet_Result, packet->Session, packet->User_ID, packet->Bill_Method, packet->Bill_Remain ); } break; case pgUser_Sync: /*-- ¼³¸í ³×Æ®¿öÅ© Àå¾Ö¿Í °°Àº ¹®Á¦·Î °ÔÀÓÁ¾·á À̺¥Æ®¸¦ ºô¸µ ½Ã½ºÅÛÀÌ Ã³¸® ÇÏÁö ¸øÇѰæ¿ì »ç¿ëÀÚ°¡ °ÔÀÓÀ» ¾ÆÁ÷ ÁøÇàÁßÀÎÁö È®ÀÎ ¿À·¡ Á¢¼ÓµÇ¾î ÀÖ´Â »ç¿ëÀÚ ¿©ºÎ È®ÀÎ ºô¸µ¼­¹ö´Â »ç¿ëÀÚ°¡ "OFF" À̸é Á¾·á ½Ã°£À» ±âÁØÀ¸·Î °ú±ÝÁ¾·á Á¾·á½Ã°£À» ¾ËÁö ¸øÇÏ¸é °Ë»ç Áֱ⸸ŭ ½Ã°£À» »©°í °è»ê */ /*-- °ÔÀÓ ¼­¹ö ÀÛ¾÷ °°Àº ¼¼¼Ç°ªÀ» °¡Áø »ç¿ëÀÚ°¡ ÀÖ´ÂÁö È®ÀÎÇØ¼­, °á°ú ¸®ÅÏ °°Àº ¼¼¼Ç°ªÀÇ »ç¿ëÀÚ°¡ ÀÖÀ¸¸é Packet_Result¿¡ 1, ¾øÀ¸¸é 0 ¹Ýȯ */ if ( packet->Packet_Result == 0 ) { if ( gameProcess != NULL ) { gameProcess->Pg_User_Sync( packet->Session, packet->User_ID, packet->User_Status ); } } if ( g_verbose == true ) { printf( "RT->ACCT::Packet_Type=User_Sync(%s, %s)\n", packet->User_ID, packet->User_Status ); } break; case pgBilling_Auth: /*-- ¼³¸í »ç¿ëÀÚ°¡ »ç¿ë °¡/ºÎ ¿©ºÎ¸¦ ¹Ýȯ */ /*-- °ÔÀÓ ¼­¹ö ÀÛ¾÷ ÀÏÁ¤ ½Ã°£ ¾È¿¡ ÀÎÁõ °á°ú¸¦ ¹ÞÁö ¸øÇϸé, ¿À·ù ó¸®(±âº» 10ÃÊ) (PC¹æ »ç¿ëÀÚÀÇ °æ¿ì, Bill_Method, Bill_Expire, Bill_Remain ¿¡´Â °ªÀÌ ¸®ÅϵÇÁö ¾Ê´Â´Ù) */ PacketResultAuth( packet->Packet_Result ); if ( packet->Packet_Result == 0 ) { if ( gameProcess != NULL ) { gameProcess->Pg_Billing_Auth( packet->Session ,packet->User_ID ,packet->User_IP ,packet->User_Status ,packet->Bill_Method ,packet->Bill_Expire ,packet->Bill_Remain ); } } break; case pgClient_Move: /*-- ¼³¸í Ŭ¶óÀÌ¾ðÆ®°¡ °ÔÀÓ¼­¹ö°£ÀÇ À̵¿À» ÇÏ¿´À» °æ¿ì ºô¸µ¼­¹ö¿¡ Å뺸 ¼­¹öÀ̵¿ ÅëÁö À̺¥Æ®ÀÇ ¹ß»ýÁöÁ¡Àº À̵¿µÈ ¼­¹ö¿¡¼­ ¹ß»ý */ /*-- °ÔÀÓ ¼­¹ö ÀÛ¾÷ À̵¿µÈ ¼­¹öID¸¦ ÆÐŶÀÇ Game_Server°ª¿¡ ¼¼ÆÃÇØ¼­ º¸³»ÁØ´Ù */ if ( packet->Packet_Result == 0 ) { if ( gameProcess != NULL ) { gameProcess->Pg_Client_Move( packet->Game_Server, packet->Session, packet->User_ID, packet->User_IP, packet->User_Status, packet->Game_No ); } } if ( g_verbose == true ) { printf( "RT->ACCT::Packet_Type=Client_Move(%s, %s)\n", packet->User_ID, packet->User_Status ); } break; // case pgServer_Conn: break; // ¼Û½ÅÀü¿ë default: // Error. Close( completionKey, perIoContext ); if ( g_verbose == true ) { printf( "RT->ACCT::Packet_Type=Unknown(%d)\n", packet->Packet_Type ); } return false; } // ó¸®ÈÄ Offset ¹× Length¸¦ ´Ù½Ã °è»êÇÑ´Ù. length -= packetSize; offset += packetSize; } // ÀÌ¾î ¹Þ±â¸¦ À§ÇØ µ¥ÀÌÅ͸¦ º¸°üÇÑÇÑ´Ù. if ( offset > 0 ) { PerIoContext* recvIoContext = mIoContextPool->GetIoContext( mSocket, IOCP_REQUEST_READ ); DWORD error = 0; if ( length > 0 ) { memcpy( recvIoContext->buffer, (perIoContext->buffer + offset), length ); recvIoContext->offset = length; } mIoContextPool->ReleaseIoContext( perIoContext, false, &error ); perIoContext = recvIoContext; } // ¼ö½ÅÀ» À§ÇØ I/O Context¸¦ ÁغñÇÑ´Ù. return RecvPost( completionKey, perIoContext ); } // Close Method void cBillConnector::Close(ULONG_PTR completionKey, PerIoContext* perIoContext) { if ( mEndClient == false && g_verbose == true ) { VOID* msgBuf; if ( ErrorCode2String( &msgBuf ) ) { printf( "\nBillConnector::Close(%d)-%s\n", GetLastError( ), (char*)msgBuf ); LocalFree( msgBuf ); } } cGameProcess* gameProcess = g_gameSrv->GetGameProcess( ); if ( gameProcess != NULL ) { gameProcess->Pg_Close( ); } cIocpClient::Close( completionKey, perIoContext ); } // ServerConn Method - °ÔÀÓ ¼­¹ö ¿¬°á ±¸ºÐ Á¤º¸(¼­¹ö ¿¬°á). // Ç×»ó ºô¸µ ¼­¹ö¿Í ¿¬°áµÉ ¶§ ¸¶´Ù °¡Àå ¸ÕÀú Àü¼Û. bool cBillConnector::ServerConn(char* Game_Server, long Game_No) { if ( IsConnect( ) == false ) return false; PerIoContext* ioContext = mIoContextPool->GetIoContext( mSocket, IOCP_REQUEST_WRITE ); _PACKET_GAME* sendMsg = (_PACKET_GAME*)ioContext->buffer; sendMsg->Packet_Type = htonl( pgServer_Conn ); strcpy( sendMsg->Game_Server, Game_Server ); sendMsg->Game_No = htonl( Game_No ); ioContext->offset = sizeof(_PACKET_GAME); return SendPost( NULL, ioContext ); } // ClientMove Method - °ÔÀÓ ¼­¹ö ¿¬°á ±¸ºÐ Á¤º¸(»ç¿ëÀÚ ¼­¹ö°£ À̵¿). // À̵¿µÈ ¼­¹öID¸¦ ÆÐŶÀÇ Game_Server°ª¿¡ ¼ÂÆÃÇØ¼­ Àü¼Û. // »ç¿ëÀÚÀÇ Á¤º¸¸¦ À̵¿µÈ ¼­¹ö¿¡ º¸³¾ ¼ö ¾øÀ» °æ¿ì À̵¿µÈ ¼­¹ö¿¡¼­ °ÔÀÓ½ÃÀÛ ÆÐŶÀ» ´Ù½Ã º¸³» // ±âÁ¸ ¿¬°áÀ» Áߺ¹·Î±×ÀΠó¸®Çϰí À̵¿µÈ ¼­¹ö¿¡¼­ °ÔÀÓÀ» ÁøÇà // (Áߺ¹·Î±×ÀΠ󸮽à ¼¼¼Ç۰ªÀº »õ·Ó°Ô »ý¼ºÇØÁà¾ß ÇÔ) bool cBillConnector::ClientMove(char* Game_Server, char* Session, char* User_ID, char* User_IP, char* User_Status, long Game_No) { if ( IsConnect( ) == false ) return false; PerIoContext* ioContext = mIoContextPool->GetIoContext( mSocket, IOCP_REQUEST_WRITE ); _PACKET_GAME* sendMsg = (_PACKET_GAME*)ioContext->buffer; sendMsg->Packet_Type = htonl( pgClient_Move ); strcpy( sendMsg->Game_Server, Game_Server ); strcpy( sendMsg->Session, Session ); memcpy( sendMsg->User_CC, COMPANY_CODE, LEN_USER_CC ); strcpy( sendMsg->User_ID, User_ID ); strcpy( sendMsg->User_IP, User_IP ); strcpy( sendMsg->User_Status, User_Status ); sendMsg->Game_No = htonl( Game_No ); ioContext->offset = sizeof(_PACKET_GAME); return SendPost( NULL, ioContext ); } // ServerReset Method - ¼­¹ö ÃʱâÈ­ ½Ã Àü¼Û Á¤º¸(¼­¹ö ´Ù¿î ½Ã Àü¼Û Á¤º¸). bool cBillConnector::ServerReset(char* Game_Server, long Game_No) { if ( IsConnect( ) == false ) return false; PerIoContext* ioContext = mIoContextPool->GetIoContext( mSocket, IOCP_REQUEST_WRITE ); _PACKET_GAME* sendMsg = (_PACKET_GAME*)ioContext->buffer; sendMsg->Packet_Type = htonl( pgServer_Reset ); strcpy( sendMsg->Game_Server, Game_Server ); sendMsg->Game_No = htonl( Game_No ); ioContext->offset = sizeof(_PACKET_GAME); return SendPost( NULL, ioContext ); } // BillingAuth Method - óÀ½ °ÔÀÓ »ç¿ëÀÚ Á¢¼Ó ÈÄ ÀÎÁõÀ» À§ÇÑ Á¤º¸. bool cBillConnector::BillingAuth(char* Session, char* User_ID, char* User_IP, long Game_No) { if ( IsConnect( ) == false ) return false; PerIoContext* ioContext = mIoContextPool->GetIoContext( mSocket, IOCP_REQUEST_WRITE ); _PACKET_GAME* sendMsg = (_PACKET_GAME*)ioContext->buffer; sendMsg->Packet_Type = htonl( pgBilling_Auth ); strcpy( sendMsg->Session, Session ); memcpy( sendMsg->User_CC, COMPANY_CODE, LEN_USER_CC ); strcpy( sendMsg->User_ID, User_ID ); strcpy( sendMsg->User_IP, User_IP ); sendMsg->Game_No = htonl( Game_No ); ioContext->offset = sizeof(_PACKET_GAME); return SendPost( NULL, ioContext ); } // GameStart Method - °ÔÀÓ ½ÃÀÛ Áï °ú±Ý ½ÃÀÛ Á¤º¸¸¦ ¾Ë¸². bool cBillConnector::GameStart(char* Game_Server, char* Session, char* User_ID, char* User_IP, long Game_No) { if ( IsConnect( ) == false ) return false; PerIoContext* ioContext = mIoContextPool->GetIoContext( mSocket, IOCP_REQUEST_WRITE ); _PACKET_GAME* sendMsg = (_PACKET_GAME*)ioContext->buffer; sendMsg->Packet_Type = htonl( pgGame_Start ); strcpy( sendMsg->Game_Server, Game_Server ); strcpy( sendMsg->Session, Session ); memcpy( sendMsg->User_CC, COMPANY_CODE, LEN_USER_CC ); strcpy( sendMsg->User_ID, User_ID ); strcpy( sendMsg->User_IP, User_IP ); sendMsg->Game_No = htonl( Game_No ); ioContext->offset = sizeof(_PACKET_GAME); return SendPost( NULL, ioContext ); } // UserSync Method - °ÔÀÓ Àå±â »ç¿ëÀÚ È®ÀÎ. bool cBillConnector::UserSync(long Packet_Result, char* Session, char* User_ID, char* User_IP, char* User_Status) { if ( IsConnect( ) == false ) return false; PerIoContext* ioContext = mIoContextPool->GetIoContext( mSocket, IOCP_REQUEST_WRITE ); _PACKET_GAME* sendMsg = (_PACKET_GAME*)ioContext->buffer; sendMsg->Packet_Type = htonl( pgUser_Sync ); sendMsg->Packet_Result = htonl( Packet_Result ); strcpy( sendMsg->Session, Session ); strcpy( sendMsg->User_ID, User_ID ); strcpy( sendMsg->User_IP, User_IP ); strcpy( sendMsg->User_Status, User_Status ); ioContext->offset = sizeof(_PACKET_GAME); return SendPost( NULL, ioContext ); } // GameEnd Method - °ÔÀÓ Á¾·á Áï °ú±Ý Á¾·á ¿äû Á¤º¸. bool cBillConnector::GameEnd(char* Session, char* User_ID, char* User_IP, char* User_Status, long Game_No) { if ( IsConnect( ) == false ) return false; PerIoContext* ioContext = mIoContextPool->GetIoContext( mSocket, IOCP_REQUEST_WRITE ); _PACKET_GAME* sendMsg = (_PACKET_GAME*)ioContext->buffer; sendMsg->Packet_Type = htonl( pgGame_End ); strcpy( sendMsg->Session, Session ); memcpy( sendMsg->User_CC, COMPANY_CODE, LEN_USER_CC ); strcpy( sendMsg->User_ID, User_ID ); strcpy( sendMsg->User_IP, User_IP ); strcpy( sendMsg->User_Status, User_Status ); sendMsg->Game_No = htonl( Game_No ); ioContext->offset = sizeof(_PACKET_GAME); return SendPost( NULL, ioContext ); } // ServerAlive Method bool cBillConnector::ServerAlive(long Game_No) { if ( IsConnect( ) == false ) return false; PerIoContext* ioContext = mIoContextPool->GetIoContext( mSocket, IOCP_REQUEST_WRITE ); _PACKET_GAME* sendMsg = (_PACKET_GAME*)ioContext->buffer; sendMsg->Packet_Type = htonl( pgServer_Alive ); memcpy( sendMsg->User_CC, COMPANY_CODE, LEN_USER_CC ); sendMsg->Game_No = htonl( Game_No ); ioContext->offset = sizeof(_PACKET_GAME); return SendPost( NULL, ioContext ); } // BackendThread Method DWORD cBillConnector::BackendThread( ) { DWORD currentTick; DWORD elapsedTick; while ( true ) { currentTick = GetTickCount( ); // ¼­¹öÁ¾·á, Thread¸¦ ³ª°£´Ù. if ( mEndClient == true ) { if ( IsConnect( ) == true ) { ServerReset( g_gameSrv->GetServerName( ) ); } break; } if ( IsConnect( ) == false ) { if ( Connect( mAddr ) == true ) { ServerConn( g_gameSrv->GetServerName( ) ); ServerReset( g_gameSrv->GetServerName( ) ); } } // Áö¿¬½Ã°£ ¾à16(ms) - CPU °úºÎÈ­ ¹æÁö & ³»ºÎ µ¿±âÈ­. elapsedTick = GetTickCount( ) - currentTick; if ( elapsedTick < 16 ) { Sleep( (16 - elapsedTick) ); } } return 0; }