#include "stdafx.h" #ifndef NOMINMAX #define NOMINMAX #endif #include "SendAgentPacket.h" #include "HanUnitedBilling.h" #include "HanUnitedBillingPacket.h" #include #include #include #include #include #include #include #include #include #include CHanUnitedSequenceID& CHanUnitedSequenceID::GetInstance() { static CHanUnitedSequenceID hanUnitedSequenceID; return hanUnitedSequenceID; } //! --------------------------------------------------------------- //! //! CHanUnitedDispatchÀÇ Session Policy¸¦ ´ã°í ÀÖ´Â Àü¿ª Ŭ·¡½ºÀÌ´Ù. //! //! --------------------------------------------------------------- class CHanUnitedPolicy { public: CHanUnitedPolicy(); ~CHanUnitedPolicy(); static CHanUnitedPolicy& GetInstance(); CSessionPolicy* GetPolicy() { return m_lpSessionPolicy; } private: CSessionPolicy* m_lpSessionPolicy; }; CHanUnitedPolicy& CHanUnitedPolicy::GetInstance() { static CHanUnitedPolicy hanUnitedPolicy; return hanUnitedPolicy; } CHanUnitedPolicy::CHanUnitedPolicy() : m_lpSessionPolicy(SessionPolicy::CreateTCPPolicy()) { } CHanUnitedPolicy::~CHanUnitedPolicy() { if(0 != m_lpSessionPolicy) { m_lpSessionPolicy->Release(); m_lpSessionPolicy = 0; } } //! --------------------------------------------------------------- CHanUnitedDispatch::LoginRequestData::LoginRequestData(const PktUUT& pktUUT, const RE_USPCheckBilling_Login& checkBillingLogin, unsigned long dwTimeoutSec, unsigned long dwSeqID, unsigned short usMsgType, unsigned char cServerGroup) : m_PktUUT(pktUUT), m_SendStamp(timeGetTime()), m_dwTimeoutSec(dwTimeoutSec), m_dwSeqID(dwSeqID), m_usMsgType(usMsgType), m_cServerGroup(cServerGroup), m_CheckBillingLogin(checkBillingLogin) { _time64(&m_SendTime); } //! --------------------------------------------------------------- CHanUnitedLogout::LogoutData::LogoutData(const PktUUT& pktUUT, DWORD dwSeqID) : m_pktUUT(pktUUT), m_dwSendStamp(timeGetTime()), m_dwSeqID(dwSeqID) { GetLocalTime(&m_systemTime); } //! --------------------------------------------------------------- //! //! ·Î±×¾Æ¿ô Á¤º¸ ¸®½ºÆ®ÀÌ´Ù. //! ÁÖ±âÀûÀ¸·Î Ã¼Å©ÇØ¼­, Ack°¡ ¿ÀÁö ¾ÊÀ¸¸é ÀçÀü¼ÛÇÑ´Ù. //! //! --------------------------------------------------------------- CHanUnitedLogout& CHanUnitedLogout::GetInstance() { static CHanUnitedLogout hanUnitedLogout; return hanUnitedLogout; } bool CHanUnitedLogout::AddLogout(const PktUUT& pktUUT) { unsigned long dwSeqID = CHanUnitedSequenceID::GetInstance().GetUniqueID(); std::pair result = m_LogoutMap.insert(std::make_pair(dwSeqID, LogoutData(pktUUT, dwSeqID))); if(!result.second) { // »ðÀÔ ½ÇÆÐ. °°Àº ½ÃÄö½º ID°¡ ÀÖ½À´Ï´Ù! SERLOG3(g_Log, "ID:%s/IP:%15s/Logout failed : insert failed(seqID:%d)", pktUUT.m_strAccount, inet_ntoa(pktUUT.m_IPAddress), dwSeqID); } else { // »ðÀÔ ¼º°ø. Àü¼ÛÀ» ½ÃµµÇÑ´Ù. GET_SINGLE_DISPATCH(lpHanUnitedBilling, CHanUnitedDispatch, CHanUnitedDispatch::GetDispatchTable()); if(0 == lpHanUnitedBilling) { // ¿¬°á ²÷¾îÁ® ÀÖÀ½. ERRLOG3(g_Log, "ID:%s/IP:%15s/Logout failed : disconnected HanUnitedBilling - Retransmission later", pktUUT.m_strAccount, inet_ntoa(pktUUT.m_IPAddress), dwSeqID); } else { LogoutData& logoutData = result.first->second; if(lpHanUnitedBilling->SendLogout(logoutData.m_pktUUT, logoutData.m_dwSeqID, &logoutData.m_systemTime)) { return true; } } } return false; } bool CHanUnitedLogout::RemoveLogout(const char* szID, const char* szIP, DWORD dwSeqID) { LogoutMap::iterator pos = m_LogoutMap.find(dwSeqID); LogoutMap::iterator end = m_LogoutMap.end(); if(pos == end) { SERLOG3(g_Log, "ID:%s/IP:%15s/RemoveLogout failed : Unknown request(seqID:%d)", szID, szIP, dwSeqID); } else { LogoutData& logoutData = pos->second; if(0 != strncmp(logoutData.m_pktUUT.m_strAccount, szID, PktUUT::MaxAccountLen) || logoutData.m_pktUUT.m_IPAddress.S_un.S_addr != inet_addr(szIP)) { SERLOG5(g_Log, "ID:%s(%s)/IP:%15s(%15s)/RemoveLogout invalid(seqID:%d)", szID, logoutData.m_pktUUT.m_strAccount, szIP, inet_ntoa(logoutData.m_pktUUT.m_IPAddress), dwSeqID); } else { DETLOG3(g_Log, "ID:%s/IP:%15s/Logout success : Remove logout success(seqID:%d)", szID, szIP, dwSeqID); } m_LogoutMap.erase(pos); return true; } return false; } void CHanUnitedLogout::Retransmission() { if(!m_LogoutMap.empty()) { GET_SINGLE_DISPATCH(lpHanUnitedBilling, CHanUnitedDispatch, CHanUnitedDispatch::GetDispatchTable()); if(0 != lpHanUnitedBilling) { LogoutMap::iterator pos = m_LogoutMap.begin(); LogoutMap::iterator end = m_LogoutMap.end(); const long RETRANSMISSION_TIMEOUT = 10 * 1000; unsigned long dwCurrentTime = timeGetTime(); for(;pos != end; ++pos) { LogoutData& logoutData = pos->second; // ÀçÀü¼ÛÇØ¾ß ÇÑ´Ù. if(RETRANSMISSION_TIMEOUT < dwCurrentTime - logoutData.m_dwSendStamp) { logoutData.m_dwSendStamp = dwCurrentTime; // ·Î±×¾Æ¿ôÀ» ÀçÀü¼ÛÇÑ´Ù. lpHanUnitedBilling->SendLogout(logoutData.m_pktUUT, logoutData.m_dwSeqID, &logoutData.m_systemTime); } } } } } //! --------------------------------------------------------------- //! //! ÇѰÔÀÓ ÅëÇÕºô¸µ ÆÐŶÀ» ó¸®Çϴ Ŭ·¡½ºÀÌ´Ù. //! //! --------------------------------------------------------------- CHanUnitedDispatch::CHanUnitedDispatch(CSession& Session) : CPacketDispatch(Session) { } CHanUnitedDispatch::~CHanUnitedDispatch() { } bool CHanUnitedDispatch::ParsePacket(char* const lpStream_In, unsigned long* dwStreamSize_InOut) { int nStreamSize = *dwStreamSize_InOut; CBufferFactory& bufferFactory = GetSession().GetPolicy().GetBufferFactory(); CBufferQueue bufferQueue; char* szPosition = lpStream_In; while(sizeof(unsigned short) <= nStreamSize) { unsigned short usPacketSize = ntohs(*reinterpret_cast(szPosition)) + sizeof(unsigned short) + sizeof(unsigned short) + sizeof(unsigned long); if(nStreamSize < usPacketSize) { // ½ºÆ®¸² Å©±âº¸´Ù µ¥ÀÌÅÍ ±æÀ̰¡ Å©¸é, break; break; } CBuffer* lpBuffer = CREATE_BUFFER(bufferFactory, std::max(usPacketSize, unsigned short(sizeof(HanUnitedBilling::GLTransStruct)))); if(0 == lpBuffer) { ERRLOG2(g_Log, "SS:0x%p/DP:0x%p/Buffer create failed", &GetSession(), this); return false; } else { memcpy(lpBuffer->wr_ptr(), szPosition, usPacketSize); lpBuffer->wr_ptr(usPacketSize); bufferQueue.enqueue(lpBuffer); szPosition += usPacketSize; nStreamSize -= usPacketSize; } } *dwStreamSize_InOut = (szPosition - lpStream_In); BufferLock::Syncronize sync(m_BufferLock); m_PacketBuffer.splice(bufferQueue); return true; } bool CHanUnitedDispatch::Dispatch() { CBuffer* lpBuffer = 0; while(0 != (lpBuffer = m_PacketBuffer.dequeue())) { bool bResult = false; HanUnitedBilling::GLTransStruct* lpTransStruct = reinterpret_cast(lpBuffer->rd_ptr()); // ¹Ì¸® ÄÁ¹öÆÃ ÇÔ. lpTransStruct->HeaderMsg = ntohs(lpTransStruct->HeaderMsg); lpTransStruct->DataSize = ntohs(lpTransStruct->DataSize); lpTransStruct->SeqID = ntohl(lpTransStruct->SeqID); switch(lpTransStruct->HeaderMsg) { case HanUnitedBilling::AUTH_RESULT: bResult = ProcessLoginResult(*lpTransStruct); break; case HanUnitedBilling::BILL_AUTH_RESULT: bResult = ProcessCanLoginResult(*lpTransStruct); break; case HanUnitedBilling::WARNNOTICE: bResult = ProcessWarnNotice(*lpTransStruct); break; case HanUnitedBilling::CUT_IP: bResult = ProcessCutIP(*lpTransStruct); break; case HanUnitedBilling::PING_AUTH: bResult = ProcessPing(*lpTransStruct); break; case HanUnitedBilling::LOGOUT_RESULT: bResult = ProcessLogoutResult(*lpTransStruct); break; default: bResult = true; ERRLOG2(g_Log, "MSGID:%d/SeqID:%d/Unknown packet received", lpTransStruct->HeaderMsg, lpTransStruct->SeqID); break; } if(!bResult) { ERRLOG2(g_Log, "MSGID:%d/SeqID:%d/Packet process failed", lpTransStruct->HeaderMsg, lpTransStruct->SeqID); } SAFE_RELEASE_BUFFER(lpBuffer); } return true; } bool CHanUnitedDispatch::ConnectToHanUnited(CIOCPNet& iocpNet) { INET_Addr& hanUnitedBillingAddr = CServerSetup::GetInstance().GetHanUnitedBillingAddr(); return iocpNet.Connect(CHanUnitedPolicy::GetInstance().GetPolicy(), hanUnitedBillingAddr.get_addr_string(), hanUnitedBillingAddr.get_port_in()); } CSingleDispatch& CHanUnitedDispatch::GetDispatchTable() { static CSingleDispatch singleDispatch; return singleDispatch; } void CHanUnitedDispatch::Connected() { DETLOG2(g_Log, "SS:0x%p/DP:0x%p/Connected HanUnitedBillingServer", &GetSession(), this); GetDispatchTable().SetDispatch(this); } void CHanUnitedDispatch::Disconnected() { DETLOG2(g_Log, "SS:0x%p/DP:0x%p/Disconnected HanUnitedBillingServer", &GetSession(), this); ProcessDisconnected(); GetDispatchTable().RemoveDispatch(this); } CBufferFactory& CHanUnitedDispatch::GetBufferFactory() { return GetSession().GetPolicy().GetBufferFactory(); } // ¹Ìµð¾îÀ¥ ÅëÇÕºô¸µ ¼­¹ö·Î ·Î±×ÀÎÀ» º¸³½´Ù. bool CHanUnitedDispatch::SendLogin(const PktUUT& pktUUT, const RE_USPCheckBilling_Login& checkBillingLogin, unsigned char cServerGroup, unsigned long dwTimeoutSec) { CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(HanUnitedBilling::GLTransStruct)); const char* szErrorReason = 0; unsigned long dwSeqID = CHanUnitedSequenceID::GetInstance().GetUniqueID(); if(0 != lpBuffer) { // ¹öÆÛ ¿­±â HanUnitedBilling::GLTransStruct* lpTransStruct = reinterpret_cast(lpBuffer->wr_ptr()); memset(lpTransStruct, 0, sizeof(HanUnitedBilling::GLTransStruct)); // Çì´õ ¼¼ÆÃ lpTransStruct->HeaderMsg = htons(HanUnitedBilling::AUTH); lpTransStruct->SeqID = htonl(dwSeqID); int nLength = 0; // IP[17] ¼¼ÆÃ _snprintf(lpTransStruct->Data + nLength, HanUnitedBilling::MAX_IP_LEN, "%s", inet_ntoa(pktUUT.m_IPAddress)); lpTransStruct->Data[nLength + HanUnitedBilling::MAX_IP_LEN - 1] = 0; nLength += HanUnitedBilling::MAX_IP_LEN; // ID[25] ¼¼ÆÃ _snprintf(lpTransStruct->Data + nLength, HanUnitedBilling::MAX_ID_LEN, "%s", pktUUT.m_strAccount); lpTransStruct->Data[nLength + HanUnitedBilling::MAX_ID_LEN - 1] = 0; nLength += HanUnitedBilling::MAX_ID_LEN; lpTransStruct->DataSize = htons(nLength); nLength += sizeof(lpTransStruct->DataSize); nLength += sizeof(lpTransStruct->HeaderMsg); nLength += sizeof(lpTransStruct->SeqID); // ¹öÆÛ ´Ý±â. lpBuffer->wr_ptr(nLength); // Å×ÀÌºí¿¡ µ¥ÀÌÅÍ »ðÀÔ. std::pair resultPair = m_LoginRequestMap.insert(LoginRequestMap::value_type(dwSeqID, LoginRequestData(pktUUT, checkBillingLogin, dwTimeoutSec, dwSeqID, HanUnitedBilling::AUTH, cServerGroup))); if(resultPair.second) { if(!GetSession().SendPending(lpBuffer)) { m_LoginRequestMap.erase(resultPair.first); szErrorReason = "³×Æ®¿öÅ©·Î Àü¼ÛÇÒ ¼ö ¾ø½À´Ï´Ù."; } } else { szErrorReason = "Å×ÀÌºí¿¡ ÀÎÁõ ¿äûÀ» ³ÖÀ» ¼ö ¾ø½À´Ï´Ù."; } } else { szErrorReason = "¸Þ¸ð¸®°¡ ºÎÁ·Çؼ­ ¹öÆÛ¸¦ ÇÒ´çÇÒ ¼ö ¾ø½À´Ï´Ù."; } if(0 != szErrorReason) { // ½ÇÆÐ ·Î±× ³²±è SERLOG7(g_Log, "UID:%u/CID:%u/SessionID:0x%p/ServerID:0x%p/ID:%s/IP:%s/ÅëÇÕºô¸µÀ¸·Î ÀÎÁõ ¿äû : %s", pktUUT.m_dwUserID, pktUUT.m_dwCharID, pktUUT.m_dwSessionID, pktUUT.m_dwServerID, pktUUT.m_strAccount, inet_ntoa(pktUUT.m_IPAddress), szErrorReason); return false; } // ¼º°ø ·Î±× ³²±è. DETLOG7(g_Log, "UID:%u/CID:%u/SessionID:0x%p/ServerID:0x%p/ID:%s/IP:%s/SeqID:%u/" "ÅëÇÕºô¸µÀ¸·Î ÀÎÁõ ¿äû¿¡ ¼º°øÇß½À´Ï´Ù.", pktUUT.m_dwUserID, pktUUT.m_dwCharID, pktUUT.m_dwSessionID, pktUUT.m_dwServerID, pktUUT.m_strAccount, inet_ntoa(pktUUT.m_IPAddress), dwSeqID); return true; } // ¹Ìµð¾îÀ¥ ÅëÇÕºô¸µ ¼­¹ö·Î ·Î±×¾Æ¿ôÀ» º¸³½´Ù. bool CHanUnitedDispatch::SendLogout(const PktUUT& pktUUT, unsigned long dwSeqID, LPSYSTEMTIME lpSystemTime, unsigned long dwTimeoutSec) { CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(HanUnitedBilling::GLTransStruct)); const char* szErrorReason = 0; if(0 != lpBuffer) { // ¹öÆÛ ¿­±â HanUnitedBilling::GLTransStruct* lpTransStruct = reinterpret_cast(lpBuffer->wr_ptr()); memset(lpTransStruct, 0, sizeof(HanUnitedBilling::GLTransStruct)); // Çì´õ ¼¼ÆÃ lpTransStruct->HeaderMsg = htons(HanUnitedBilling::LOGOUT); lpTransStruct->SeqID = htonl(dwSeqID); int nLength = 0; // IP[17] ¼¼ÆÃ _snprintf(lpTransStruct->Data + nLength, HanUnitedBilling::MAX_IP_LEN, "%s", inet_ntoa(pktUUT.m_IPAddress)); lpTransStruct->Data[nLength + HanUnitedBilling::MAX_IP_LEN - 1] = 0; nLength += HanUnitedBilling::MAX_IP_LEN; // ID[25] ¼¼ÆÃ _snprintf(lpTransStruct->Data + nLength, HanUnitedBilling::MAX_ID_LEN, "%s", pktUUT.m_strAccount); lpTransStruct->Data[nLength + HanUnitedBilling::MAX_ID_LEN - 1] = 0; nLength += HanUnitedBilling::MAX_ID_LEN; // OutTime[18] ¼¼ÆÃ SYSTEMTIME systemTime; if(0 == lpSystemTime) { GetLocalTime(&systemTime); lpSystemTime = &systemTime; } _snprintf(lpTransStruct->Data + nLength, HanUnitedBilling::MAX_OUT_TIME_LEN, "%04d%02d%02d%02d%02d%02d", lpSystemTime->wYear, lpSystemTime->wMonth, lpSystemTime->wDay, lpSystemTime->wHour, lpSystemTime->wMinute, lpSystemTime->wSecond); lpTransStruct->Data[nLength + HanUnitedBilling::MAX_OUT_TIME_LEN - 1] = 0; nLength += HanUnitedBilling::MAX_OUT_TIME_LEN; lpTransStruct->DataSize = htons(nLength); nLength += sizeof(lpTransStruct->DataSize); nLength += sizeof(lpTransStruct->HeaderMsg); nLength += sizeof(lpTransStruct->SeqID); // ¹öÆÛ ´Ý±â. lpBuffer->wr_ptr(nLength); // ´Ü¼ø Àü´ÞÀ̱⠶§¹®¿¡ Å×ÀÌºí¿¡ ³ÖÀ» ÇÊ¿ä´Â ¾øÀ½. if(!GetSession().SendPending(lpBuffer)) { szErrorReason = "³×Æ®¿öÅ©·Î Àü¼ÛÇÏ´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù."; } } else { szErrorReason = "¸Þ¸ð¸®°¡ ºÎÁ·Çؼ­ ¹öÆÛ¸¦ ÇÒ´çÇÒ ¼ö ¾ø½À´Ï´Ù."; } if(0 != szErrorReason) { // ½ÇÆÐ ·Î±× ³²±è SERLOG7(g_Log, "UID:%u/CID:%u/SessionID:0x%p/ServerID:0x%p/ID:%s/IP:%s/ÅëÇÕºô¸µ ·Î±×¾Æ¿ô Àü¼Û : %s", pktUUT.m_dwUserID, pktUUT.m_dwCharID, pktUUT.m_dwSessionID, pktUUT.m_dwServerID, pktUUT.m_strAccount, inet_ntoa(pktUUT.m_IPAddress), szErrorReason); return false; } // ¼º°ø ·Î±× ³²±è. DETLOG6(g_Log, "UID:%u/CID:%u/SessionID:0x%p/ServerID:0x%p/ID:%s/IP:%s/" "ÅëÇÕºô¸µ ·Î±×¾Æ¿ô Àü¼Û¿¡ ¼º°øÇß½À´Ï´Ù.", pktUUT.m_dwUserID, pktUUT.m_dwCharID, pktUUT.m_dwSessionID, pktUUT.m_dwServerID, pktUUT.m_strAccount, inet_ntoa(pktUUT.m_IPAddress)); return true; } // ¹Ìµð¾îÀ¥ ÅëÇÕºô¸µ ¼­¹ö·Î ·Î±×ÀÎ ÇÒ ¼ö ÀÖ´ÂÁö ¿©ºÎ¸¦ º¸³½´Ù. bool CHanUnitedDispatch::SendCanLogin(const PktUUT& pktUUT, const RE_USPCheckBilling_Login& checkBillingLogin, unsigned char cServerGroup, unsigned long dwTimeoutSec) { CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(HanUnitedBilling::GLTransStruct)); const char* szErrorReason = 0; unsigned long dwSeqID = CHanUnitedSequenceID::GetInstance().GetUniqueID(); if(0 != lpBuffer) { // ¹öÆÛ ¿­±â HanUnitedBilling::GLTransStruct* lpTransStruct = reinterpret_cast(lpBuffer->wr_ptr()); // Çì´õ ¼¼ÆÃ lpTransStruct->HeaderMsg = htons(HanUnitedBilling::BILL_AUTH); lpTransStruct->SeqID = htonl(dwSeqID); int nLength = 0; // IP[17] ¼¼ÆÃ _snprintf(lpTransStruct->Data + nLength, HanUnitedBilling::MAX_IP_LEN, "%s", inet_ntoa(pktUUT.m_IPAddress)); lpTransStruct->Data[nLength + HanUnitedBilling::MAX_IP_LEN - 1] = 0; nLength += HanUnitedBilling::MAX_IP_LEN; // ID[25] ¼¼ÆÃ _snprintf(lpTransStruct->Data + nLength, HanUnitedBilling::MAX_ID_LEN, "%s", pktUUT.m_strAccount); lpTransStruct->Data[nLength + HanUnitedBilling::MAX_ID_LEN - 1] = 0; nLength += HanUnitedBilling::MAX_ID_LEN; lpTransStruct->DataSize = htons(nLength); nLength += sizeof(lpTransStruct->DataSize); nLength += sizeof(lpTransStruct->HeaderMsg); nLength += sizeof(lpTransStruct->SeqID); // ¹öÆÛ ´Ý±â. lpBuffer->wr_ptr(nLength); // Å×ÀÌºí¿¡ µ¥ÀÌÅÍ »ðÀÔ. std::pair resultPair = m_LoginRequestMap.insert(LoginRequestMap::value_type(dwSeqID, LoginRequestData(pktUUT, checkBillingLogin, dwTimeoutSec, dwSeqID, HanUnitedBilling::BILL_AUTH, cServerGroup))); if(resultPair.second) { if(!GetSession().SendPending(lpBuffer)) { m_LoginRequestMap.erase(resultPair.first); szErrorReason = "³×Æ®¿öÅ© Àü¼Û¿¡ ½ÇÆÐÇß½À´Ï´Ù."; } } else { szErrorReason = "Å×ÀÌºí¿¡ ¿äûÀ» ³ÖÀ» ¼ö ¾ø½À´Ï´Ù."; } } else { szErrorReason = "¸Þ¸ð¸®°¡ ºÎÁ·Çؼ­ ¹öÆÛ¸¦ ÇÒ´çÇÒ ¼ö ¾ø½À´Ï´Ù."; } if(0 != szErrorReason) { // ½ÇÆÐ ·Î±× ³²±è SERLOG7(g_Log, "UID:%u/CID:%u/SessionID:0x%p/ServerID:0x%p/ID:%s/IP:%s/ÅëÇÕºô¸µ °ú±Ý°¡´É ¿©ºÎ ¿äû : %s", pktUUT.m_dwUserID, pktUUT.m_dwCharID, pktUUT.m_dwSessionID, pktUUT.m_dwServerID, pktUUT.m_strAccount, inet_ntoa(pktUUT.m_IPAddress), szErrorReason); return false; } // ¼º°ø ·Î±× ³²±è. DETLOG7(g_Log, "UID:%u/CID:%u/SessionID:0x%p/ServerID:0x%p/ID:%s/IP:%s/SeqID:%u/" "ÅëÇÕºô¸µ °ú±Ý°¡´É ¿©ºÎ ¿äû ¼º°ø.", pktUUT.m_dwUserID, pktUUT.m_dwCharID, pktUUT.m_dwSessionID, pktUUT.m_dwServerID, pktUUT.m_strAccount, inet_ntoa(pktUUT.m_IPAddress), dwSeqID); return true; } // ·Î±×ÀÎ °á°ú ó¸® bool CHanUnitedDispatch::ProcessLoginResult(HanUnitedBilling::GLTransStruct& glTransStruct) { // 1. ¸Þ½ÃÁö ±æÀ̸¦ üũÇÕ´Ï´Ù. // 2. ¸Þ½ÃÁö SeqID·Î ´©°¡ ¿äûÀ» Çß´ÂÁö »ìÇÌ´Ï´Ù. ¿äûÀÚÀÇ Á¤º¸¸¦ ¾ò°í ·Î±×¸¦ Âï½À´Ï´Ù. // ¿äûÀÚ Á¤º¸¸¦ ¾òÀ» ¼ö ¾øÀ¸¸é, ·Î±×¸¦ Âï°í ÆÐŶÀ» ¹ö¸³´Ï´Ù. // 3. ·Î±×ÀÎ °á°ú¸¦ È®ÀÎÇÕ´Ï´Ù. ·Î±×ÀÎÀÌ ¼º°øÇßÀ¸¸é, Ŭ¶óÀÌ¾ðÆ®·Î ¼º°øÀ» º¸³»°í, // ·Î±×ÀÎÀÌ ½ÇÆÐÇßÀ¸¸é, °³ÀÎÁ¤·® üũ¸¦ ÇÑ ÈÄ¿¡, üũ °á°ú¸¦ Ŭ¶óÀÌ¾ðÆ®·Î º¸³À´Ï´Ù. /* Data Format IP char[17] ID char[25] result short (1 = success, 0 = failed) */ const int nExpectedDataSize = HanUnitedBilling::MAX_ID_LEN + HanUnitedBilling::MAX_IP_LEN + sizeof(short); // È£Ãâ Àü¿¡ ¹Ì¸® È£½ºÆ® ¿À´õ·Î ÄÁ¹öÆÃ ÇßÀ½ if(nExpectedDataSize != glTransStruct.DataSize) { ERRLOG2(g_Log, "Invalid auth result packet size : expected(%d), real(%d)", nExpectedDataSize, glTransStruct.DataSize); } else { const char* szIP = glTransStruct.Data; const char* szID = glTransStruct.Data + HanUnitedBilling::MAX_IP_LEN; short usResult = 0; memcpy(&usResult, glTransStruct.Data + HanUnitedBilling::MAX_IP_LEN + HanUnitedBilling::MAX_ID_LEN, sizeof(short)); usResult = ntohs(usResult); LoginRequestMap::iterator pos = m_LoginRequestMap.find(glTransStruct.SeqID); LoginRequestMap::iterator end = m_LoginRequestMap.end(); if(pos == end) { SERLOG3(g_Log, "ID:%s/IP:%s/RequestKey:%d/ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ : ¿äû ۸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.", szID, szIP, glTransStruct.SeqID); } else { LoginRequestData requestData = pos->second; m_LoginRequestMap.erase(pos); unsigned long dwResult = 0; const char* szErrorMessage = 0; if(0 == usResult) { // ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ. °³ÀÎÁ¤·® üũ ÈÄ °á°ú Àü¼Û switch(requestData.m_CheckBillingLogin.Flag) { case 2: // ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ // °³ÀÎÁ¤·® ·Î±×ÀÎ ½ÇÆÐ // ·Î±×ÀÎ ½ÇÆÐ ÆÐŶ º¸³¿. (°ú±Ý ³»¿ª ¾øÀ½ ÆÐŶ) AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 2, 0, 0, 'N', 0, 0); SERLOG6(g_Log, "ID:%s/IP:%s/UID:%d/CID:%d/Account:%s/RequestKey:%d/ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ : °ú±Ý Á¤º¸°¡ ¾ø½À´Ï´Ù.", szID, szIP, requestData.m_PktUUT.m_dwUserID, requestData.m_PktUUT.m_dwCharID, requestData.m_PktUUT.m_strAccount, glTransStruct.SeqID); break; case 3: // ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ // °³ÀÎÁ¤·® ·Î±×ÀÎ ¼º°ø // DB¿¡ ÇÁ·Î½ÃÀú È£Ãâ ÈÄ ·Î±×ÀÎ ¼º°ø º¸³¿ // DB¿¡ ij¸¯ÅÍ Insert. ¸¸ÀÏ flag°¡ 1À̸é Áߺ¹·Î±×ÀÎÀ̹ǷΠ½ÇÆÐ º¸³¿. // Login : TableType(1). // CanLogin : TableType(0) if(!DBComponent::BillingDB::USPCheckBilling_InsertCurrentUser_Post(CDBSingleObject::GetInstance(), 1, requestData.m_PktUUT.m_strAccount, requestData.m_PktUUT.m_dwUserID, inet_ntoa(requestData.m_PktUUT.m_IPAddress), requestData.m_cServerGroup, requestData.m_CheckBillingLogin.strBillingType[0], 0, &dwResult)) { // DB È£Ãâ¿¡¼­ ½ÇÆÐÇÑ °æ¿ì. AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 4, 0, 0, 'N', 0, 0); szErrorMessage = "ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ : DBÄõ¸®(USPCheckBilling_InsertCurrentUser_Post) ½ÇÆÐ"; } else if(1 == dwResult) { // DB È£Ãâ¿¡¼­ ¼º°øÇßÁö¸¸, Áߺ¹·Î±×ÀÎÀÎ °æ¿ì. // (ÅëÇÕºô¸µ °ÅÃÄ ¿À´Â »çÀÌ ¸ÕÀú ·Î±×ÀÎ µÈ °æ¿ì) AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 1, 0, 0, 'N', 0, 0); szErrorMessage = "ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ : Áߺ¹·Î±×ÀÎ"; } else { // °³ÀÎÁ¤·® üũ ¼º°ø. ·Î±×ÀνÃŲ´Ù. AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 0, requestData.m_CheckBillingLogin.PlayTime, requestData.m_CheckBillingLogin.intCRMIndex1, requestData.m_CheckBillingLogin.strBillingType[0], 0, 0); szErrorMessage = "°³ÀÎÁ¤·® ·Î±×ÀÎ ¼º°ø."; } SERLOG7(g_Log, "ID:%s/IP:%s/UID:%d/CID:%d/Account:%s/RequestKey:%d/%s", szID, szIP, requestData.m_PktUUT.m_dwUserID, requestData.m_PktUUT.m_dwCharID, requestData.m_PktUUT.m_strAccount, glTransStruct.SeqID, szErrorMessage); break; } } else { // ÅëÇÕºô¸µ ·Î±×ÀÎ ¼º°ø. // DB¿¡ ij¸¯ÅÍ Insert. ¸¸ÀÏ Flag°¡ 1À̸é Áߺ¹·Î±×ÀÎÀ̹ǷΠ·Î±×ÀÎ ½ÇÆÐ // Login : TableType(1). // CanLogin : TableType(0) if(!DBComponent::BillingDB::USPCheckBilling_InsertCurrentUser_Post(CDBSingleObject::GetInstance(), 1, requestData.m_PktUUT.m_strAccount, requestData.m_PktUUT.m_dwUserID, inet_ntoa(requestData.m_PktUUT.m_IPAddress), requestData.m_cServerGroup, 'N', -1, &dwResult)) { // DB È£Ãâ¿¡¼­ ½ÇÆÐÇÑ °æ¿ì. AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 4, 0, 0, 'N', 0, 0); // ÅëÇÕºô¸µ ·Î±×ÀÎÀº ¼º°øÇßÀ¸¹Ç·Î ·Î±×ÀÎ ½ÇÆÐ¸¦ ´Ù½Ã º¸³¿ if(!CHanUnitedLogout::GetInstance().AddLogout(requestData.m_PktUUT)) { szErrorMessage = "ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ : DBÄõ¸®(USPCheckBilling_InsertCurrentUser_Post) ½ÇÆÐ" " ¹× ÅëÇÕºô¸µ ·Î±×ÀÎ Ãë¼Ò(·Î±×¾Æ¿ô) Àü¼Û ½ÇÆÐ"; } else { szErrorMessage = "ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ : DBÄõ¸®(USPCheckBilling_InsertCurrentUser_Post) ½ÇÆÐ"; } } else if(1 == dwResult) { // DB È£Ãâ¿¡¼­ ¼º°øÇßÁö¸¸, Áߺ¹·Î±×ÀÎÀÎ °æ¿ì. // (ÅëÇÕºô¸µ °ÅÃÄ ¿À´Â »çÀÌ ¸ÕÀú ·Î±×ÀÎ µÈ °æ¿ì) AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 1, 0, 0, 'N', 0, 0); // ÅëÇÕºô¸µ ·Î±×ÀÎÀº ¼º°øÇßÀ¸¹Ç·Î ·Î±×ÀÎ ½ÇÆÐ¸¦ ´Ù½Ã º¸³¿ if(!CHanUnitedLogout::GetInstance().AddLogout(requestData.m_PktUUT)) { szErrorMessage = "ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ : Áߺ¹·Î±×ÀÎ ¹× ÅëÇÕºô¸µ ·Î±×ÀÎ Ãë¼Ò(·Î±×¾Æ¿ô) Àü¼Û ½ÇÆÐ"; } else { szErrorMessage = "ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ : Áߺ¹·Î±×ÀÎ"; } } else { // ·Î±×ÀÎ ¼º°ø. DB¿¡ ÇÁ·Î½ÃÀú È£Ãâ ÈÄ ·Î±×ÀÎ ¼º°ø º¸³¿ AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 0, 0, 1, 'S', 0, 0); szErrorMessage = "ÅëÇÕºô¸µ ·Î±×ÀÎ ¼º°ø"; } SERLOG7(g_Log, "ID:%s/IP:%s/UID:%d/CID:%d/Account:%s/RequestKey:%d/%s", szID, szIP, requestData.m_PktUUT.m_dwUserID, requestData.m_PktUUT.m_dwCharID, requestData.m_PktUUT.m_strAccount, glTransStruct.SeqID, szErrorMessage); } } } return true; } // ·Î±×ÀÎ ÇÒ ¼ö ÀÖ´ÂÁö ¿©ºÎ·Î °á°ú ó¸®. bool CHanUnitedDispatch::ProcessCanLoginResult(HanUnitedBilling::GLTransStruct& glTransStruct) { // 1. ¸Þ½ÃÁö ±æÀ̸¦ üũÇÕ´Ï´Ù. // 2. ¸Þ½ÃÁö SeqID·Î ´©°¡ ¿äûÀ» Çß´ÂÁö »ìÇÌ´Ï´Ù. ¿äûÀÚÀÇ Á¤º¸¸¦ ¾ò°í ·Î±×¸¦ Âï½À´Ï´Ù. // ¿äûÀÚ Á¤º¸¸¦ ¾òÀ» ¼ö ¾øÀ¸¸é, ·Î±×¸¦ Âï°í ÆÐŶÀ» ¹ö¸³´Ï´Ù. // 3. ·Î±×ÀÎ °á°ú¸¦ È®ÀÎÇÕ´Ï´Ù. ·Î±×ÀÎÀÌ ¼º°øÇßÀ¸¸é, Ŭ¶óÀÌ¾ðÆ®·Î ¼º°øÀ» º¸³»°í, // ·Î±×ÀÎÀÌ ½ÇÆÐÇßÀ¸¸é, °³ÀÎÁ¤·® üũ¸¦ ÇÑ ÈÄ¿¡, üũ °á°ú¸¦ Ŭ¶óÀÌ¾ðÆ®·Î º¸³À´Ï´Ù. /* Data Format IP char[17] ID char[25] result short (1 = success, 0 = failed) */ const int nExpectedDataSize = HanUnitedBilling::MAX_ID_LEN + HanUnitedBilling::MAX_IP_LEN + sizeof(short); // È£Ãâ Àü¿¡ ¹Ì¸® È£½ºÆ® ¿À´õ·Î ÄÁ¹öÆÃ ÇßÀ½ if(nExpectedDataSize != glTransStruct.DataSize) { ERRLOG2(g_Log, "Invalid auth result packet size : expected(%d), real(%d)", nExpectedDataSize, glTransStruct.DataSize); } else { const char* szIP = glTransStruct.Data; const char* szID = glTransStruct.Data + HanUnitedBilling::MAX_IP_LEN; short usResult = 0; memcpy(&usResult, glTransStruct.Data + HanUnitedBilling::MAX_IP_LEN + HanUnitedBilling::MAX_ID_LEN, sizeof(short)); usResult = ntohs(usResult); LoginRequestMap::iterator pos = m_LoginRequestMap.find(glTransStruct.SeqID); LoginRequestMap::iterator end = m_LoginRequestMap.end(); if(pos == end) { SERLOG3(g_Log, "ID:%s/IP:%s/RequestKey:%d/ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ : ¿äû ۸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù.", szID, szIP, glTransStruct.SeqID); } else { LoginRequestData requestData = pos->second; m_LoginRequestMap.erase(pos); unsigned long dwResult = 0; const char* szErrorMessage = 0; if(0 == usResult) { // ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ. °³ÀÎÁ¤·® üũ ÈÄ °á°ú Àü¼Û switch(requestData.m_CheckBillingLogin.Flag) { case 2: // ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ // °³ÀÎÁ¤·® ·Î±×ÀÎ ½ÇÆÐ // ·Î±×ÀÎ ½ÇÆÐ ÆÐŶ º¸³¿. (°ú±Ý ³»¿ª ¾øÀ½ ÆÐŶ) AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 2, 0, 0, 'N', 0, 0); SERLOG6(g_Log, "ID:%s/IP:%s/UID:%d/CID:%d/Account:%s/RequestKey:%d/ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ : °ú±Ý Á¤º¸°¡ ¾ø½À´Ï´Ù.", szID, szIP, requestData.m_PktUUT.m_dwUserID, requestData.m_PktUUT.m_dwCharID, requestData.m_PktUUT.m_strAccount, glTransStruct.SeqID); break; case 3: // ÅëÇÕºô¸µ ·Î±×ÀÎ ½ÇÆÐ // °³ÀÎÁ¤·® ·Î±×ÀÎ ¼º°ø // DB¿¡ ÇÁ·Î½ÃÀú È£Ãâ ÈÄ ·Î±×ÀÎ ¼º°ø º¸³¿ // DB¿¡ ij¸¯ÅÍ Insert. ¸¸ÀÏ flag°¡ 1À̸é Áߺ¹·Î±×ÀÎÀ̹ǷΠ½ÇÆÐ º¸³¿. // Login : TableType(1). // CanLogin : TableType(0) if(!DBComponent::BillingDB::USPCheckBilling_InsertCurrentUser_Post(CDBSingleObject::GetInstance(), 0, requestData.m_PktUUT.m_strAccount, requestData.m_PktUUT.m_dwUserID, inet_ntoa(requestData.m_PktUUT.m_IPAddress), requestData.m_cServerGroup, requestData.m_CheckBillingLogin.strBillingType[0], 0, &dwResult)) { // DB È£Ãâ¿¡¼­ ½ÇÆÐÇÑ °æ¿ì. AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 4, 0, 0, 'N', 0, 0); szErrorMessage = "ÅëÇÕºô¸µ °ú±Ý ºÒ°¡´É : DBÄõ¸®(USPCheckBilling_InsertCurrentUser_Post) ½ÇÆÐ"; } else if(1 == dwResult) { // DB È£Ãâ¿¡¼­ ¼º°øÇßÁö¸¸, Áߺ¹·Î±×ÀÎÀÎ °æ¿ì. // (ÅëÇÕºô¸µ °ÅÃÄ ¿À´Â »çÀÌ ¸ÕÀú ·Î±×ÀÎ µÈ °æ¿ì) AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 1, 0, 0, 'N', 0, 0); szErrorMessage = "ÅëÇÕºô¸µ °ú±Ý ºÒ°¡´É : Áߺ¹·Î±×ÀÎ"; } else { // °³ÀÎÁ¤·® üũ ¼º°ø. ·Î±×ÀνÃŲ´Ù. AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 0, requestData.m_CheckBillingLogin.PlayTime, requestData.m_CheckBillingLogin.intCRMIndex1, requestData.m_CheckBillingLogin.strBillingType[0], 0, 0); szErrorMessage = "°³ÀÎÁ¤·® °ú±Ý °¡´É."; } SERLOG7(g_Log, "ID:%s/IP:%s/UID:%d/CID:%d/Account:%s/RequestKey:%d/%s", szID, szIP, requestData.m_PktUUT.m_dwUserID, requestData.m_PktUUT.m_dwCharID, requestData.m_PktUUT.m_strAccount, glTransStruct.SeqID, szErrorMessage); break; } } else { // ÅëÇÕºô¸µ ·Î±×ÀÎ ¼º°ø. // DB¿¡ ij¸¯ÅÍ Insert. ¸¸ÀÏ Flag°¡ 1À̸é Áߺ¹·Î±×ÀÎÀ̹ǷΠ·Î±×ÀÎ ½ÇÆÐ // Login : TableType(1). // CanLogin : TableType(0) if(!DBComponent::BillingDB::USPCheckBilling_InsertCurrentUser_Post(CDBSingleObject::GetInstance(), 0, requestData.m_PktUUT.m_strAccount, requestData.m_PktUUT.m_dwUserID, inet_ntoa(requestData.m_PktUUT.m_IPAddress), requestData.m_cServerGroup, 'N', -1, &dwResult)) { // DB È£Ãâ¿¡¼­ ½ÇÆÐÇÑ °æ¿ì. AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 4, 0, 0, 'N', 0, 0); szErrorMessage = "ÅëÇÕºô¸µ °ú±Ý ºÒ°¡´É : DBÄõ¸®(USPCheckBilling_InsertCurrentUser_Post) ½ÇÆÐ"; } else if(1 == dwResult) { // DB È£Ãâ¿¡¼­ ¼º°øÇßÁö¸¸, Áߺ¹·Î±×ÀÎÀÎ °æ¿ì. // (ÅëÇÕºô¸µ °ÅÃÄ ¿À´Â »çÀÌ ¸ÕÀú ·Î±×ÀÎ µÈ °æ¿ì) AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 1, 0, 0, 'N', 0, 0); szErrorMessage = "ÅëÇÕºô¸µ °ú±Ý ºÒ°¡´É : Áߺ¹·Î±×ÀÎ"; } else { // ·Î±×ÀÎ ¼º°ø. DB¿¡ ÇÁ·Î½ÃÀú È£Ãâ ÈÄ ·Î±×ÀÎ ¼º°ø º¸³¿ AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 0, 0, 1, 'S', 0, 0); szErrorMessage = "ÅëÇÕºô¸µ °ú±Ý °¡´É"; } SERLOG7(g_Log, "ID:%s/IP:%s/UID:%d/CID:%d/Account:%s/RequestKey:%d/%s", szID, szIP, requestData.m_PktUUT.m_dwUserID, requestData.m_PktUUT.m_dwCharID, requestData.m_PktUUT.m_strAccount, glTransStruct.SeqID, szErrorMessage); } } } return true; } // °ú±Ý °æ°í ¸Þ½ÃÁö bool CHanUnitedDispatch::ProcessWarnNotice(HanUnitedBilling::GLTransStruct& glTransStruct) { /* DBÁß°è¼­¹ö·Î ÆÐŶÀ» ±×´ë·Î ³¯¸°´Ù. DBÁß°è¿¡¼­ ÆÐŶÀ» ¹ÞÀ¸¸é, ¹Ù·Î äÆÃ ¼­¹ö·Î relayÇϰí, äÆÃ ¼­¹ö¿¡¼­ 󸮸¦ ÇÑ´Ù. Data Format IP char[17] ID char[25] msg char[70] */ // UID -> DBÁß°è -> äÆÃ -> Ŭ¶óÀÌ¾ðÆ® // ÇѰÔÀÓ ÅëÇÕºô¸µ °æ°í ¸Þ½ÃÁö const int nExpectedDataSize = HanUnitedBilling::MAX_ID_LEN + HanUnitedBilling::MAX_IP_LEN + HanUnitedBilling::MAX_MSG_LEN; // È£Ãâ Àü¿¡ ¹Ì¸® È£½ºÆ® ¿À´õ·Î ÄÁ¹öÆÃ ÇßÀ½ if(nExpectedDataSize != glTransStruct.DataSize) { ERRLOG2(g_Log, "Invalid auth result packet size : expected(%d), real(%d)", nExpectedDataSize, glTransStruct.DataSize); } else { const char* szIP = glTransStruct.Data; const char* szID = glTransStruct.Data + HanUnitedBilling::MAX_IP_LEN; const char* szMsg = szID + HanUnitedBilling::MAX_ID_LEN; if(AgentSendPacket::SendHanUnitedBTN(szID, szIP, szMsg)) { DETLOG3(g_Log, "ID:%s/IP:%s/ÅëÇÕºô¸µ °ú±Ý °æ°í ¸Þ½ÃÁö Àü¼Û ¼º°ø : (%s)", szID, szIP, szMsg); } else { SERLOG3(g_Log, "ID:%s/IP:%s/ÅëÇÕºô¸µ °ú±Ý °æ°í ¸Þ½ÃÁö Àü¼Û ½ÇÆÐ : (%s)", szID, szIP, szMsg); } } return true; } // ƯÁ¤ ip²÷±â bool CHanUnitedDispatch::ProcessCutIP(HanUnitedBilling::GLTransStruct& glTransStruct) { /* DBÁß°è¼­¹ö·Î ÆÐŶÀ» ±×´ë·Î ³¯¸°´Ù. DBÁß°è¿¡¼­ ÆÐŶÀ» ¹ÞÀ¸¸é, ID, IP·Î »ç¶÷À» ãÀº ÈÄ, UserKillÀ» ³¯¸°´Ù. Data Format IP char[17] ID char[25] */ // UID -> DBÁß°è -> °ÔÀÓ(UserKill) const int nExpectedDataSize = HanUnitedBilling::MAX_ID_LEN + HanUnitedBilling::MAX_IP_LEN; // È£Ãâ Àü¿¡ ¹Ì¸® È£½ºÆ® ¿À´õ·Î ÄÁ¹öÆÃ ÇßÀ½ if(nExpectedDataSize != glTransStruct.DataSize) { ERRLOG2(g_Log, "Invalid auth result packet size : expected(%d), real(%d)", nExpectedDataSize, glTransStruct.DataSize); } else { const char* szIP = glTransStruct.Data; const char* szID = glTransStruct.Data + HanUnitedBilling::MAX_IP_LEN; if(AgentSendPacket::SendHanUnitedUserKill(szID, szIP)) { DETLOG2(g_Log, "ID:%s/IP:%s/ÅëÇÕºô¸µ °ú±Ý ¸¸·á Á¢¼Ó ²÷±â Àü¼Û ¼º°ø", szID, szIP); } else { SERLOG2(g_Log, "ID:%s/IP:%s/ÅëÇÕºô¸µ °ú±Ý ¸¸·á Á¢¼Ó ²÷±â Àü¼Û ½ÇÆÐ", szID, szIP); } } return true; } bool CHanUnitedDispatch::ProcessPing(HanUnitedBilling::GLTransStruct& glTransStruct) { CBuffer* lpBuffer = CREATE_BUFFER(GetBufferFactory(), sizeof(HanUnitedBilling::GLTransStruct)); if(0 != lpBuffer) { // ¹öÆÛ ¿­±â HanUnitedBilling::GLTransStruct* lpTransStruct = reinterpret_cast(lpBuffer->wr_ptr()); *lpTransStruct = glTransStruct; lpTransStruct->HeaderMsg = htons(glTransStruct.HeaderMsg); lpTransStruct->DataSize = htons(glTransStruct.DataSize); lpTransStruct->SeqID = htonl(glTransStruct.SeqID); size_t nLength = lpTransStruct->DataSize; nLength += sizeof(lpTransStruct->DataSize); nLength += sizeof(lpTransStruct->HeaderMsg); nLength += sizeof(lpTransStruct->SeqID); lpBuffer->wr_ptr(nLength); if(GetSession().SendPending(lpBuffer)) { return true; } else { DETLOG0(g_Log, "ÇÎ ÆÐŶÀ» µÇµ¹·Á º¸³»´Â µ¥ ½ÇÆÐÇß½À´Ï´Ù."); } } return false; } // ·Î±×¾Æ¿ô Ackó¸®. bool CHanUnitedDispatch::ProcessLogoutResult(HanUnitedBilling::GLTransStruct& glTransStruct) { const int nExpectedDataSize = HanUnitedBilling::MAX_ID_LEN + HanUnitedBilling::MAX_IP_LEN + sizeof(short); // È£Ãâ Àü¿¡ ¹Ì¸® È£½ºÆ® ¿À´õ·Î ÄÁ¹öÆÃ ÇßÀ½ if(nExpectedDataSize != glTransStruct.DataSize) { ERRLOG2(g_Log, "Invalid auth result packet size : expected(%d), real(%d)", nExpectedDataSize, glTransStruct.DataSize); } else { const char* szIP = glTransStruct.Data; const char* szID = glTransStruct.Data + HanUnitedBilling::MAX_IP_LEN; short usResult = 0; memcpy(&usResult, glTransStruct.Data + HanUnitedBilling::MAX_IP_LEN + HanUnitedBilling::MAX_ID_LEN, sizeof(short)); usResult = ntohs(usResult); return CHanUnitedLogout::GetInstance().RemoveLogout(szID, szIP, glTransStruct.SeqID); } return false; }; void CHanUnitedDispatch::ProcessTimeout() { LoginRequestMap::iterator pos = m_LoginRequestMap.begin(); LoginRequestMap::iterator end = m_LoginRequestMap.end(); unsigned long dwCurrentTime= timeGetTime(); for(;pos != end; ) { unsigned long dwRequestKey = pos->first; LoginRequestData& requestData = pos->second; long nDiffTime = requestData.m_SendStamp + (requestData.m_dwTimeoutSec * 1000) - dwCurrentTime; if(0 < nDiffTime) { ++pos; } else { // ·Î±×¸¦ ³²±â°í Á¦°ÅÇÑ´Ù. const int MAX_BUFFER = 1024; char szBuffer[MAX_BUFFER]; _snprintf(szBuffer, MAX_BUFFER - 1, "UID:%u/CID:%u/SessionID:0x%p/ServerID:0x%p/ID:%s/IP:%s/RequestKey:%u/Cmd:%d/CurrentTime:%u/" "SendStamp:%u/TimeoutSec:%u/Request timeout. Cancel login request.", requestData.m_PktUUT.m_dwUserID, requestData.m_PktUUT.m_dwCharID, requestData.m_PktUUT.m_dwSessionID, requestData.m_PktUUT.m_dwServerID, requestData.m_PktUUT.m_strAccount, inet_ntoa(requestData.m_PktUUT.m_IPAddress), dwRequestKey, requestData.m_usMsgType, dwCurrentTime, requestData.m_SendStamp, requestData.m_dwTimeoutSec * 1000); szBuffer[MAX_BUFFER - 1] = 0; SERLOG1(g_Log, "%s", szBuffer); if(HanUnitedBilling::AUTH == requestData.m_usMsgType || HanUnitedBilling::BILL_AUTH == requestData.m_usMsgType) { // ·Î±×ÀÎ ºÒ°¡ ó¸®. AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 4, 0, 0, 'N', 0, 0); } pos = m_LoginRequestMap.erase(pos); } } } void CHanUnitedDispatch::ProcessDisconnected() { LoginRequestMap::iterator pos = m_LoginRequestMap.begin(); LoginRequestMap::iterator end = m_LoginRequestMap.end(); unsigned long dwCurrentTime= timeGetTime(); for(;pos != end; ++pos) { unsigned long dwRequestKey = pos->first; LoginRequestData& requestData = pos->second; // ·Î±×¸¦ ³²±â°í Á¦°ÅÇÑ´Ù. const int MAX_BUFFER = 1024; char szBuffer[MAX_BUFFER]; _snprintf(szBuffer, MAX_BUFFER - 1, "UID:%u/CID:%u/SessionID:0x%p/ServerID:0x%p/ID:%s/IP:%s/RequestKey:%u/Cmd:%d/CurrentTime:%u/" "SendStamp:%u/TimeoutSec:%u/Disconnected HanUnitedBilling. Cancel login request .", requestData.m_PktUUT.m_dwUserID, requestData.m_PktUUT.m_dwCharID, requestData.m_PktUUT.m_dwSessionID, requestData.m_PktUUT.m_dwServerID, requestData.m_PktUUT.m_strAccount, inet_ntoa(requestData.m_PktUUT.m_IPAddress), dwRequestKey, requestData.m_usMsgType, dwCurrentTime, requestData.m_SendStamp, requestData.m_dwTimeoutSec * 1000); szBuffer[MAX_BUFFER - 1] = 0; SERLOG1(g_Log, "%s", szBuffer); if(HanUnitedBilling::AUTH == requestData.m_usMsgType || HanUnitedBilling::BILL_AUTH == requestData.m_usMsgType) { // ·Î±×ÀÎ ºÒ°¡ ó¸®. AgentSendPacket::SendUpdateUIDTable( requestData.m_cServerGroup, requestData.m_PktUUT.m_cCmd, requestData.m_PktUUT.m_dwUserID, 4, 0, 0, 'N', 0, 0); } } m_LoginRequestMap.clear(); }