void MMatchClient::ParseUDPPacket(char* pData, MPacketHeader* pPacketHeader, DWORD dwIP, unsigned int nPort) { switch (pPacketHeader->nMsg) { case MSGID_RAWCOMMAND: { unsigned short nCheckSum = MBuildCheckSum(pPacketHeader, pPacketHeader->nSize); if (pPacketHeader->nCheckSum != nCheckSum) { static int nLogCount = 0; if (nLogCount++ < 100) { // Log Flooding 방지 mlog("MMatchClient::ParseUDPPacket() -> CHECKSUM ERROR(R=%u/C=%u)\n", pPacketHeader->nCheckSum, nCheckSum); } return; } else { MCommand* pCmd = new MCommand(); if (!pCmd->SetData(pData, &m_CommandManager)) { mlog("MMatchClient::ParseUDPPacket() -> SetData Error\n"); delete pCmd; return; } MUID uidPeer = FindPeerUID(dwIP, nPort); if (uidPeer != MUID(0,0)) { pCmd->m_Sender = uidPeer; } else { // TODO: 여기 수정해야함. sockaddr_in Addr; Addr.sin_addr.S_un.S_addr = dwIP; Addr.sin_port = nPort; char* pszIP = inet_ntoa(Addr.sin_addr); if (strcmp(pszIP, GetAgentIP()) == 0) { pCmd->m_Sender = GetAgentServerUID(); } else if( (MC_RESPONSE_SERVER_LIST_INFO == pCmd->GetID()) || (MC_RESPONSE_BLOCK_COUNTRY_CODE_IP == pCmd->GetID()) ) { // 특별히 하는건 없음. // Lcator는 Peer설정이 되지 않기때문에 여기서 따로 처리함. } else if (pCmd->GetID() == MC_UDP_PONG) { // 특별히 하는건 없음. Command를 넘겨주기 위해서...(밑에 커맨드를 딜리트하기때문에) } else { delete pCmd; pCmd = NULL; return; } } pCmd->m_Receiver = m_This; if( IsUDPCommandValidationCheck(pCmd->GetID()) ) { LockRecv(); m_CommandManager.Post(pCmd); UnlockRecv(); } else { #ifdef _DEBUG mlog("%s(ID:%d) is Denied Command!\n" , pCmd->m_pCommandDesc->GetName(), pCmd->GetID()); #endif } } } break; case MSGID_COMMAND: { int nPacketSize = pPacketHeader->CalcPacketSize(&m_PeerPacketCrypter); unsigned short nCheckSum = MBuildCheckSum(pPacketHeader, nPacketSize); if (pPacketHeader->nCheckSum != nCheckSum) { static int nLogCount = 0; if (nLogCount++ < 100) { // Log Flooding 방지 mlog("MMatchClient::ParseUDPPacket() -> CHECKSUM ERROR(R=%u/C=%u)\n", pPacketHeader->nCheckSum, nCheckSum); } return; } else { MCommand* pCmd = new MCommand(); int nCmdSize = nPacketSize - sizeof(MPacketHeader); if (!m_PeerPacketCrypter.Decrypt(pData, nCmdSize)) { mlog("MMatchClient::ParseUDPPacket() -> Decrypt Error\n"); delete pCmd; pCmd = NULL; return; } if (!pCmd->SetData(pData, &m_CommandManager)) { // TODO: 여기 수정해야함. sockaddr_in Addr; Addr.sin_addr.S_un.S_addr = dwIP; Addr.sin_port = nPort; char* pszIP = inet_ntoa(Addr.sin_addr); mlog("MMatchClient::ParseUDPPacket() -> MSGID_COMMAND SetData Error(%s:%d), size=%d\n", pszIP, nPort, nCmdSize); delete pCmd; pCmd = NULL; return; } MUID uidPeer = FindPeerUID(dwIP, nPort); if (uidPeer != MUID(0,0)) { pCmd->m_Sender = uidPeer; } else { // Agent와는 암호화된 커맨드는 사용하지 않는다. delete pCmd; return; /* // TODO: 여기 수정해야함. sockaddr_in Addr; Addr.sin_addr.S_un.S_addr = dwIP; Addr.sin_port = nPort; char* pszIP = inet_ntoa(Addr.sin_addr); if (strcmp(pszIP, GetAgentIP()) == 0) { pCmd->m_Sender = GetAgentServerUID(); }else { delete pCmd; pCmd = NULL; return; } */ } pCmd->m_Receiver = m_This; if( IsUDPCommandValidationCheck(pCmd->GetID()) ) { LockRecv(); m_CommandManager.Post(pCmd); UnlockRecv(); } else { #ifdef _DEBUG mlog("%s(ID:%d) is Denied Command!\n" , pCmd->m_pCommandDesc->GetName(), pCmd->GetID()); #endif } } } break; default: { Log("MatchClient: Parse Packet Error"); } break; } }