void CGateInfo::MakeNewUser(char *pszPacket) { char szDecodeMsg[256]; char szEncodeMsg[32]; char *pszID, *pszName, *pszPassword; _TDEFAULTMESSAGE DefMsg; fnDecodeMessageA(&DefMsg, pszPacket); if (DefMsg.wIdent == CM_ADDNEWUSER) { int nPos = fnDecode6BitBufA((pszPacket + DEFBLOCKSIZE), szDecodeMsg, sizeof(szDecodeMsg)); szDecodeMsg[nPos] = '\0'; pszID = &szDecodeMsg[0]; pszName = (char *)memchr(szDecodeMsg, '/', memlen(szDecodeMsg) - 1); *pszName = '\0'; pszName++; pszPassword = (char *)memchr(pszName, '/', memlen(pszName) - 1); *pszPassword = '******'; pszPassword++; if ((memlen(pszID) - 1) || (memlen(pszName) - 1) || (memlen(pszPassword) - 1)) { char szQuery[1024]; sprintf( szQuery, "INSERT TBL_ACCOUNT( FLD_LOGINID, FLD_PASSWORD, FLD_USERNAME, FLD_CERTIFICATION ) " "VALUES( '%s', '%s', '%s', 0 )", pszID, pszPassword, pszName ); CRecordset *pRec = GetDBManager()->CreateRecordset(); if ( pRec->Execute( szQuery ) && pRec->GetRowCount() ) fnMakeDefMessageA( &DefMsg, SM_NEWID_SUCCESS, 0, 0, 0, 0 ); else fnMakeDefMessageA( &DefMsg, SM_NEWID_FAIL, 0, 0, 0, 0 ); GetDBManager()->DestroyRecordset( pRec ); // ----------------------------------------------------------------------------------- } else fnMakeDefMessageA(&DefMsg, SM_NEWID_FAIL, 0, 0, 0, 0); fnEncodeMessageA(&DefMsg, szEncodeMsg, sizeof(szEncodeMsg)); szDecodeMsg[0] = '#'; memmove(&szDecodeMsg[1], szEncodeMsg, DEFBLOCKSIZE); szDecodeMsg[DEFBLOCKSIZE + 1] = '!'; szDecodeMsg[DEFBLOCKSIZE + 2] = '\0'; send(sock, szDecodeMsg, DEFBLOCKSIZE + 2, 0); } }
DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID) { DWORD dwBytesTransferred; CServerInfo* pServerInfo; LPOVERLAPPED lpOverlapped; DWORD dwFlags; DWORD dwRecvBytes; char szBuff[DATA_BUFSIZE]; int nBuffLen; char *pszFirst, *pszEnd, *pszDivide; LONG lValid; WORD w1, w2; char szCC[32]; int nPos; while (TRUE) { GetQueuedCompletionStatus((HANDLE)CompletionPortID, &dwBytesTransferred, (LPDWORD)&pServerInfo, (LPOVERLAPPED *)&lpOverlapped, INFINITE); if (g_fTerminated) return 0L; if (dwBytesTransferred == 0) { closesocket(pServerInfo->m_sock); if (pServerInfo) GlobalFree(pServerInfo); UpdateStatusBarSession(FALSE); continue; } if (pServerInfo->nOvFlag == OVERLAPPED_RECV) { if (pServerInfo->nRemainBuffLen) { memmove(szBuff, pServerInfo->RemainBuff, pServerInfo->nRemainBuffLen); // Copy previous remain data in szBuff memmove(&szBuff[pServerInfo->nRemainBuffLen], pServerInfo->Buffer, dwBytesTransferred + 1); // Append new received data in szBuff nBuffLen = pServerInfo->nRemainBuffLen + dwBytesTransferred; pszEnd = &szBuff[0]; } else { pszEnd = &pServerInfo->Buffer[0]; nBuffLen = dwBytesTransferred; } while (nBuffLen) { if ((pszFirst = (char *)memchr(pszEnd, '#', nBuffLen)) && (pszEnd = (char *)memchr(pszFirst, '!', nBuffLen))) { *pszEnd++ = '\0'; if (pszDivide = (char *)memchr(pszFirst, '/', pszEnd - pszFirst)) { *pszDivide++ = '\0'; _LPTSENDBUFF lpSendUserData = new _TSENDBUFF; if (lpSendUserData) { lpSendUserData->nCertification = AnsiStrToVal(pszFirst + 1); w1 = lpSendUserData->nCertification ^ 0xAA; w2 = memlen(pszDivide) - 1; lValid = MAKELONG(w1, w2); nPos = fnEncode6BitBufA((unsigned char *)&lValid, szCC, sizeof(LONG), sizeof(szCC)); szCC[nPos] = '\0'; if (memcmp((pszEnd - nPos - 1), szCC, nPos) == 0) { fnDecodeMessageA(&lpSendUserData->DefMsg, pszDivide); *(pszEnd - nPos - 1) = '\0'; if (lpSendUserData->DefMsg.wIdent >= 100 && lpSendUserData->DefMsg.wIdent <= 200) { lpSendUserData->pServerInfo = pServerInfo; switch (lpSendUserData->DefMsg.wIdent) { case DB_MAKEITEMRCD2: { lpSendUserData->lpbtAddData = new BYTE[sizeof(_TMAKEITEMRCD)]; fnDecode6BitBufA((pszDivide + DEFBLOCKSIZE), (char *)lpSendUserData->lpbtAddData, sizeof(_TMAKEITEMRCD)); lpSendUserData->lpbtAddData2 = NULL; break; } default: { nPos = fnDecode6BitBufA((pszDivide + DEFBLOCKSIZE), (char *)&lpSendUserData->HumanLoad, sizeof(lpSendUserData->HumanLoad)); switch (lpSendUserData->DefMsg.wIdent) { case DB_MAKEITEMRCD: { lpSendUserData->lpbtAddData = new BYTE[sizeof(_TMAKEITEMRCD)]; fnDecode6BitBufA((pszDivide + DEFBLOCKSIZE + 75), (char *)lpSendUserData->lpbtAddData, sizeof(_TMAKEITEMRCD)); lpSendUserData->lpbtAddData2 = NULL; break; } case DB_SAVEHUMANRCD: { lpSendUserData->lpbtAddData = new BYTE[sizeof(_THUMANRCD)]; fnDecode6BitBufA((pszDivide + DEFBLOCKSIZE + 75), (char *)lpSendUserData->lpbtAddData, sizeof(_THUMANRCD)); int nRemainLen = (int)(pszEnd - pszFirst) - (DEFBLOCKSIZE + 75 + HUMANRCDBLOCKSIZE); lpSendUserData->lpbtAddData2 = new BYTE[nRemainLen + 1]; memcpy(lpSendUserData->lpbtAddData2, (pszDivide + DEFBLOCKSIZE + 75 + HUMANRCDBLOCKSIZE), nRemainLen); lpSendUserData->lpbtAddData2[nRemainLen] = '\0'; break; } default: lpSendUserData->lpbtAddData = NULL; lpSendUserData->lpbtAddData2 = NULL; } break; } } g_DBMsgQ.PushQ((BYTE *)lpSendUserData); } else g_ServerMsgQ.PushQ((BYTE *)lpSendUserData); } else delete lpSendUserData; } } nBuffLen -= (pszEnd - pszFirst); } else break; } // while if (pszFirst && nBuffLen) { memmove(pServerInfo->RemainBuff, pszFirst, nBuffLen); pServerInfo->nRemainBuffLen = nBuffLen; #ifdef _DEBUG _RPT2(_CRT_WARN, "Remain Packet : %d, %s\n", nBuffLen, pszFirst); #endif } else pServerInfo->nRemainBuffLen = 0; // Set next overlapped Process dwFlags = 0; ZeroMemory(&(pServerInfo->Overlapped), sizeof(OVERLAPPED)); pServerInfo->DataBuf.len = DATA_BUFSIZE; pServerInfo->DataBuf.buf = pServerInfo->Buffer; pServerInfo->nOvFlag = OVERLAPPED_RECV; if (WSARecv(pServerInfo->m_sock, &(pServerInfo->DataBuf), 1, &dwRecvBytes, &dwFlags, &(pServerInfo->Overlapped), NULL) == SOCKET_ERROR) { if (WSAGetLastError() != ERROR_IO_PENDING) { InsertLogMsg(_T("WSARecv() failed")); // CloseSession(pServerInfo); continue; } } } // if (OVERLAPPED_RECV) } return 0; }
void CGateInfo::ProcLogin(SOCKET s, char *pszData) { char szIDPassword[32]; char *pszID, *pszPassword; char szEncodePacket[64]; _TDEFAULTMESSAGE DefMsg; int nPos; char szQuery[256]; if (memlen(pszData) - 1 <= 0) return; PLISTNODE pListNode = xUserInfoList.GetHead(); while (pListNode) { CUserInfo *pUserInfo = xUserInfoList.GetData(pListNode); if (pUserInfo->sock == s) { int nDecodeLen = fnDecode6BitBufA(pszData, szIDPassword, sizeof(szIDPassword)); szIDPassword[nDecodeLen] = '\0'; pszID = &szIDPassword[0]; if (pszPassword = (char *)memchr(szIDPassword, '/', sizeof(szIDPassword))) { *pszPassword = '******'; pszPassword++; sprintf( szQuery, "SELECT * FROM TBL_ACCOUNT WHERE FLD_LOGINID='%s'", pszID ); CRecordset *pRec = GetDBManager()->CreateRecordset(); if ( !pRec->Execute( szQuery ) || !pRec->Fetch() ) fnMakeDefMessageA( &DefMsg, SM_ID_NOTFOUND, 0, 0, 0, 0 ); else if ( CompareDBString( pszPassword, pRec->Get( "FLD_PASSWORD" ) ) != 0 ) fnMakeDefMessageA( &DefMsg, SM_PASSWD_FAIL, 0, 0, 0, 0 ); else { int nCertCode = atoi( pRec->Get( "FLD_CERTIFICATION" ) ); /* if ( nCertCode > 0 && nCertCode < 30 ) fnMakeDefMessageA(&DefMsg, SM_CERTIFICATION_FAIL, (nCertCode + 1), 0, 0, 0); else if ( nCertCode >= 30 ) fnMakeDefMessageA(&DefMsg, SM_CERTIFICATION_FAIL, 1, 0, 0, 0); else*/ { char szEncodeServerList[512]; char szEncodeAllPacket[1024]; fnMakeDefMessageA(&DefMsg, SM_PASSOK_SELECTSERVER, 0, 1, 0, 0); nPos = fnEncodeMessageA(&DefMsg, szEncodePacket, sizeof(szEncodePacket)); szEncodePacket[nPos] = '\0'; int nPos2 = fnEncode6BitBufA((unsigned char *)g_szServerList, szEncodeServerList, memlen(g_szServerList), sizeof(szEncodeServerList)); szEncodeServerList[nPos2] = '\0'; memmove(szEncodeAllPacket, szEncodePacket, nPos); memmove(&szEncodeAllPacket[nPos], szEncodeServerList, memlen(szEncodeServerList)); SendToGate(s, szEncodeAllPacket); GetDBManager()->DestroyRecordset( pRec ); pUserInfo->nCertification = GetCertification(); // pRec = GetDBManager()->CreateRecordset(); // sprintf( szQuery, // "UPDATE TBL_ACCOUNT SET FLD_CERTIFICATION=%d WHERE FLD_LOGINID='%s'", // GetCertification(), pszID ); // pRec->Execute( szQuery ); // GetDBManager()->DestroyRecordset( pRec ); return; } } GetDBManager()->DestroyRecordset( pRec ); nPos = fnEncodeMessageA(&DefMsg, szEncodePacket, sizeof(szEncodePacket)); szEncodePacket[nPos] = '\0'; SendToGate(s, szEncodePacket); } } pListNode = xUserInfoList.GetNext(pListNode); } }
//fnMakeDefMessageA 数据头 // void CGateInfo::ProcAddUser(SOCKET s, char *pszData) { char szEntryInfo[2048]; AccountUser UserEntryInfo; _TDEFAULTMESSAGE DefMsg; char szEncodePacket[64]; int len = fnDecode6BitBufA(pszData, (char *)&szEntryInfo, sizeof(szEntryInfo)); szEntryInfo[len] = '\0'; if ( !ParseUserEntry( szEntryInfo, &UserEntryInfo ) ) fnMakeDefMessageA(&DefMsg, SM_NEWID_FAIL, 0, 0, 0, 0); else { AccountUser *pAlreadyUser = AccoutManager::GetInstance().GetAccount(UserEntryInfo.m_id); if (pAlreadyUser) { //已经存在 fnMakeDefMessageA(&DefMsg, SM_NEWID_EXISTS, 0, 0, 0, 0); } else { char szQuery[1024] = {0}; sprintf( szQuery, "insert into Account(id,pwd) values('%s','%s')",UserEntryInfo.m_id,UserEntryInfo.m_pwd); //解析 db::DBServer *pServer = DBManager::GetInstance().GetFreeCon(); if (pServer == NULL) { fnMakeDefMessageA(&DefMsg, SM_NEWID_FAIL, 0, 0, 0, 0); } else { if (pServer->ExecuteSQL(szQuery)) { fnMakeDefMessageA(&DefMsg, SM_NEWID_SUCCESS, 0, 0, 0, 0); AccountUser *pNewUser = new AccountUser(); strcpy(pNewUser->m_id,UserEntryInfo.m_id); strcpy(pNewUser->m_pwd,UserEntryInfo.m_pwd); AccoutManager::GetInstance().InsertAccountUser(pNewUser); } else { fnMakeDefMessageA(&DefMsg, SM_NEWID_FAIL, 0, 0, 0, 0); } DBManager::GetInstance().ReleaseCon(pServer); } fnMakeDefMessageA(&DefMsg, SM_NEWID_SUCCESS, 0, 0, 0, 0); TCHAR szID[50]; MultiByteToWideChar( CP_ACP, 0, UserEntryInfo.m_id, -1, szID, sizeof( szID ) / sizeof( TCHAR ) ); InsertLogMsgParam(IDS_COMPLETENEWUSER, szID); } } //加密数据头 fnEncodeMessageA(&DefMsg, szEncodePacket, sizeof(szEncodePacket)); SendToGate(s, szEncodePacket); }
void ProcReceiveBuffer(char *pszPacket, int nRecv) { int nBuffLen = nRecv; char szBuff[DATA_BUFSIZE]; char *pszFirst, *pszEnd = &szBuff[0], *pszDevide; _TDEFAULTMESSAGE DefMsg; _TDEFAULTMESSAGE SendDefMsg; int nCertification; WORD w1, w2; LONG lValid; int nPos; char szCC[32]; char szEncodeMsg[256]; CReadyUserInfo *pReadUserInfo; CUserInfo *pUserInfo; _TCLIENTITEMRCD tClientItemRcd; if (g_nRemainBuffLen) memmove(szBuff, g_szRemainBuff, g_nRemainBuffLen); memmove(&szBuff[g_nRemainBuffLen], pszPacket, nBuffLen + 1); nBuffLen += g_nRemainBuffLen; while (nBuffLen) { if ((pszFirst = (char *)memchr(pszEnd, '#', nBuffLen)) && (pszEnd = (char *)memchr(pszFirst, '!', nBuffLen))) { *pszEnd++ = '\0'; if (pszDevide = (char *)memchr(pszFirst, '/', pszEnd - pszFirst)) { *pszDevide++ = '\0'; nCertification = AnsiStrToVal(pszFirst + 1); w1 = nCertification ^ 0xAA; w2 = memlen(pszDevide) - 1; lValid = MAKELONG(w1, w2); nPos = fnEncode6BitBufA((unsigned char *)&lValid, szCC, sizeof(LONG), sizeof(szCC)); szCC[nPos] = '\0'; if (memcmp((pszEnd - nPos - 1), szCC, nPos) == 0) { fnDecodeMessageA(&DefMsg, pszDevide); *(pszEnd - nPos - 1) = '\0'; switch (DefMsg.wIdent) { case DBR_LOADHUMANRCD2: { CReadyUserInfo2* pReadyUserInfo2 = new CReadyUserInfo2; pReadyUserInfo2->m_dwReadyStartTime = GetTickCount(); pReadyUserInfo2->m_nNumOfGenItem = HIBYTE(DefMsg.wParam); pReadyUserInfo2->m_nNumOfMagic = DefMsg.wSeries; pReadyUserInfo2->m_nNumOfItem = LOBYTE(DefMsg.wParam); fnDecode6BitBufA((pszDevide + DEFBLOCKSIZE), (char *)&pReadyUserInfo2->m_THumanRcd, sizeof(_THUMANRCD)); memmove(pReadyUserInfo2->pszData, pszDevide + DEFBLOCKSIZE + HUMANRCDBLOCKSIZE, memlen(pszDevide + DEFBLOCKSIZE + HUMANRCDBLOCKSIZE)); g_xReadyUserInfoList2.AddNewNode(pReadyUserInfo2); break; } case DBR_LOADHUMANRCD: { pReadUserInfo = (CReadyUserInfo *)DefMsg.nRecog; nPos = fnDecode6BitBufA((pszDevide + DEFBLOCKSIZE), (char *)&pReadUserInfo->m_pUserInfo->m_THumanRcd, sizeof(_THUMANRCD)); char *pszData; pszData = (pszDevide + DEFBLOCKSIZE + HUMANRCDBLOCKSIZE); if (HIBYTE(DefMsg.wParam)) // Decode General Item { pReadUserInfo->m_pUserInfo->m_nNumOfGenItems = HIBYTE(DefMsg.wParam); _TGENITEMRCD GenItemRcd; char szVal[5]; for (int i = 0; i < HIBYTE(DefMsg.wParam); i++) { _LPTGENERALITEMRCD lptGenItemRcd = new _TGENERALITEMRCD; if (lptGenItemRcd) { fnDecode6BitBufA(pszData, (char *)&GenItemRcd, sizeof(_TGENITEMRCD)); memcpy(lptGenItemRcd->szMakeIndex, GenItemRcd.szItem, 12); ZeroMemory(szVal, sizeof(szVal)); memcpy(szVal, &lptGenItemRcd->szMakeIndex[1], 3); lptGenItemRcd->nStdIndex = AnsiStrToVal(szVal); memcpy(szVal, &lptGenItemRcd->szMakeIndex[4], 4); lptGenItemRcd->nDura = AnsiStrToVal(szVal); memcpy(szVal, &lptGenItemRcd->szMakeIndex[8], 4); lptGenItemRcd->nDuraMax = AnsiStrToVal(szVal); pReadUserInfo->m_pUserInfo->m_lpTGenItemRcd.AddNewNode(lptGenItemRcd); pszData += GENITEMRCDBLOCKSIZE; } } } if (DefMsg.wSeries) // Decode Magic { pReadUserInfo->m_pUserInfo->m_nNumOfMagics = DefMsg.wSeries; for (int i = 0; i < DefMsg.wSeries; i++) { _LPTHUMANMAGICRCD lpHumanMagicRcd = new _THUMANMAGICRCD; if (lpHumanMagicRcd) { fnDecode6BitBufA(pszData, (char *)lpHumanMagicRcd, sizeof(_THUMANMAGICRCD)); pReadUserInfo->m_pUserInfo->m_lpTMagicRcd.AddNewNode(lpHumanMagicRcd); pszData += MAGICRCDBLOCKSIZE; //#ifdef _DEBUG // _RPT3(_CRT_WARN, "%d - %d - %d\n", lpHumanMagicRcd->btLevel, lpHumanMagicRcd->btUseKey, lpHumanMagicRcd->nCurrTrain); //#endif } } } if (LOBYTE(DefMsg.wParam)) // Decode Item { pReadUserInfo->m_pUserInfo->m_nNumOfItems = LOBYTE(DefMsg.wParam); // pReadUserInfo->m_pUserInfo->m_lpTItemRcd = (_LPTUSERITEMRCD)GlobalAlloc(GPTR, sizeof(_TUSERITEMRCD) * DefMsg.wParam); for (int i = 0; i < LOBYTE(DefMsg.wParam); i++) { _LPTUSERITEMRCD lpTItemRcd = new _TUSERITEMRCD; if (lpTItemRcd) { fnDecode6BitBufA(pszData, (char *)lpTItemRcd, sizeof(_TUSERITEMRCD)); pReadUserInfo->m_pUserInfo->m_lpTItemRcd.AddNewNode(lpTItemRcd); pszData += ITEMRCDBLOCKSIZE; } } } if (DefMsg.wTag) // Decode Horse { if (!pReadUserInfo->m_pUserInfo->m_lpTHorseRcd) pReadUserInfo->m_pUserInfo->m_lpTHorseRcd = new _THORSERCD; fnDecode6BitBufA(pszData, (char *)pReadUserInfo->m_pUserInfo->m_lpTHorseRcd, sizeof(_THORSERCD)); } if (pReadUserInfo->m_pUserInfo->m_pxPlayerObject) { pReadUserInfo->m_pUserInfo->m_pxPlayerObject->MakeFeature(); pReadUserInfo->m_pUserInfo->m_pxPlayerObject->Initialize(); pReadUserInfo->m_pUserInfo->m_pxPlayerObject->m_fIsAlive = TRUE; pReadUserInfo->m_pUserInfo->m_btCurrentMode = USERMODE_PLAYGAME; } break; } case DBR_MAKEITEMRCD: { pUserInfo = (CUserInfo *)DefMsg.nRecog; _LPTUSERITEMRCD lpTItemRcd = new _TUSERITEMRCD; if (lpTItemRcd) { nPos = fnDecode6BitBufA((pszDevide + DEFBLOCKSIZE), (char *)lpTItemRcd, sizeof(_TUSERITEMRCD)); pUserInfo->m_lpTItemRcd.AddNewNode(lpTItemRcd); fnMakeDefMessage(&SendDefMsg, SM_ADDITEM, (int)pUserInfo->m_pxPlayerObject, 0, 0, 1); if (lpTItemRcd->szMakeIndex[0] != 'G') { g_pStdItemSpecial[lpTItemRcd->nStdIndex].GetStandardItem(&tClientItemRcd); g_pStdItemSpecial[lpTItemRcd->nStdIndex].GetUpgradeStdItem(&tClientItemRcd, lpTItemRcd); } memcpy(tClientItemRcd.szMakeIndex, lpTItemRcd->szMakeIndex, 12); tClientItemRcd.nDura = lpTItemRcd->nDura; tClientItemRcd.nDuraMax = lpTItemRcd->nDuraMax; nPos = fnEncode6BitBufA((unsigned char *)&tClientItemRcd, szEncodeMsg, sizeof(_TCLIENTITEMRCD), sizeof(szEncodeMsg)); szEncodeMsg[nPos] = '\0'; pUserInfo->m_pxPlayerObject->SendSocket(&SendDefMsg, szEncodeMsg); } break; } case DBR_MAKEITEMRCD2: { CPlayerObject* pPlayerObject = (CPlayerObject *)DefMsg.nRecog; pUserInfo = pPlayerObject->m_pUserInfo; _LPTUSERITEMRCD lpTItemRcd = new _TUSERITEMRCD; if (lpTItemRcd) { nPos = fnDecode6BitBufA((pszDevide + DEFBLOCKSIZE), (char *)lpTItemRcd, sizeof(_TUSERITEMRCD)); pUserInfo->m_lpTItemRcd.AddNewNode(lpTItemRcd); fnMakeDefMessage(&SendDefMsg, SM_ADDITEM, (int)pUserInfo->m_pxPlayerObject, 0, 0, 1); if (lpTItemRcd->szMakeIndex[0] != 'G') { g_pStdItemSpecial[lpTItemRcd->nStdIndex].GetStandardItem(&tClientItemRcd); g_pStdItemSpecial[lpTItemRcd->nStdIndex].GetUpgradeStdItem(&tClientItemRcd, lpTItemRcd); } memcpy(tClientItemRcd.szMakeIndex, lpTItemRcd->szMakeIndex, 12); tClientItemRcd.nDura = lpTItemRcd->nDura; tClientItemRcd.nDuraMax = lpTItemRcd->nDuraMax; nPos = fnEncode6BitBufA((unsigned char *)&tClientItemRcd, szEncodeMsg, sizeof(_TCLIENTITEMRCD), sizeof(szEncodeMsg)); szEncodeMsg[nPos] = '\0'; pUserInfo->m_pxPlayerObject->SendSocket(&SendDefMsg, szEncodeMsg); } break; } } } } nBuffLen -= (pszEnd - pszFirst); } else break; } // while if (pszFirst && (nBuffLen > 0)) { memmove(g_szRemainBuff, pszFirst, nBuffLen); g_nRemainBuffLen = nBuffLen; #ifdef _DEBUG _RPT2(_CRT_WARN, "ProcReceiveBuffer:%d, %s\n", g_nRemainBuffLen, pszFirst); #endif } else g_nRemainBuffLen = 0; }
void CGateInfo::GetSelectCharacter(SOCKET s, char *pszPacket) { char szDecodeMsg[128]; char szServerIP[32]; char szEncodeMsg[32]; char szEncodeData[64]; char szEncodePacket[256]; _TDEFAULTMESSAGE DefaultMsg; // ORZ: Load Balancing, 접속수가 가장 적은 게이트 서버 IP 선택 GAMESERVERINFO *pBestServer = NULL; GAMESERVERINFO *pTemp; // EnterCriticalSection( &g_xGameServerList.m_cs ); for ( PLISTNODE pNode = g_xGameServerList.GetHead();pNode; pNode = g_xGameServerList.GetNext( pNode ) ) { pTemp = g_xGameServerList.GetData( pNode ); if ( !pBestServer || pTemp->connCnt < pBestServer->connCnt ) { pBestServer = pTemp; continue; } } pBestServer->connCnt++; // LeaveCriticalSection( &g_xGameServerList.m_cs ); strcpy( szServerIP, pBestServer->ip ); // ORZ: from here int nPos = fnDecode6BitBufA(pszPacket, szDecodeMsg, sizeof(szDecodeMsg)); szDecodeMsg[nPos] = '\0'; char *pszDevide = (char *)memchr(szDecodeMsg, '/', nPos); if (pszDevide) { *pszDevide++ = '\0'; // 서버 선택이 가능하도록 수정 _TLOADHUMAN tLoadHuman; CServerInfo* pServerInfo; memcpy(tLoadHuman.szUserID, szDecodeMsg, memlen(szDecodeMsg)); memcpy(tLoadHuman.szCharName, pszDevide, memlen(pszDevide)); ZeroMemory(tLoadHuman.szUserAddr, sizeof(tLoadHuman.szUserAddr)); tLoadHuman.nCertification = 0; PLISTNODE pListNode = g_xServerList.GetHead(); if (pListNode) pServerInfo = g_xServerList.GetData(pListNode); GetLoadHumanRcd(pServerInfo, &tLoadHuman, 0); fnMakeDefMessageA(&DefaultMsg, SM_STARTPLAY, 0, 0, 0, 0); nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg)); int nPos2 = fnEncode6BitBufA((unsigned char *)szServerIP, szEncodeData, memlen(szServerIP) -1, sizeof(szEncodeData)); memmove(szEncodePacket, szEncodeMsg, nPos); memmove(&szEncodePacket[nPos], szEncodeData, nPos2); szEncodePacket[nPos + nPos2] = '\0'; // ORZ: 전체 리스트에 추가한다. // 같은 아이디가 이미 존재하거나 메모리 부족등의 이유로 실패할 수 있다. // if ( GetGlobalUserList()->Insert( tLoadHuman.szCharName, szServerIP ) ) SendToGate(s, szEncodePacket); // else // { // fnMakeDefMessageA(&DefaultMsg, SM_STARTFAIL, 0, 0, 0, 0); // nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg)); // szEncodeMsg[nPos] = '\0'; // SendToGate(pGateInfo->sock, s, szEncodeMsg); // } } }
void CGateInfo::QueryCharacter(SOCKET s, char *pszPacket) { _TQUERYCHR tQueryChr[3]; char szDecodeMsg[128]; int nCnt = 0; char szQuery[256]; ZeroMemory(tQueryChr, sizeof(tQueryChr)); int nPos = fnDecode6BitBufA(pszPacket, szDecodeMsg, sizeof(szDecodeMsg)); szDecodeMsg[nPos] = '\0'; char *pszDevide = (char *)memchr(szDecodeMsg, '/', nPos); if (pszDevide) { *pszDevide++ = '\0'; sprintf( szQuery, "SELECT * FROM TBL_CHARACTER WHERE FLD_LOGINID='%s'", pszDevide ); CRecordset *pRec = GetDBManager()->CreateRecordset(); if (pRec->Execute( szQuery )) { while (pRec->Fetch() && nCnt < 3) { tQueryChr[nCnt].btClass = atoi( pRec->Get( "FLD_JOB" ) ); tQueryChr[nCnt].btGender = atoi( pRec->Get( "FLD_GENDER" ) ); strcpy( tQueryChr[nCnt].szName, pRec->Get( "FLD_CHARNAME" ) ); ChangeSpaceToNull( tQueryChr[nCnt].szName ); nCnt++; } } GetDBManager()->DestroyRecordset( pRec ); _TDEFAULTMESSAGE DefaultMsg; char szEncodeMsg[32]; char szEncodeData[256]; char szEncodePacket[256]; if (nCnt > 0 && nCnt < 3) { fnMakeDefMessageA(&DefaultMsg, SM_QUERYCHR, 0, nCnt, 0, 0); nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg)); int nPos2 = fnEncode6BitBufA((unsigned char *)tQueryChr, szEncodeData, sizeof(_TQUERYCHR) * nCnt, sizeof(szEncodeData)); memmove(szEncodePacket, szEncodeMsg, nPos); memmove(&szEncodePacket[nPos], szEncodeData, nPos2); szEncodePacket[nPos + nPos2] = '\0'; SendToGate(s, szEncodePacket); } else { fnMakeDefMessageA(&DefaultMsg, SM_QUERYCHR_FAIL, 0, 0, 0, 0); nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg)); szEncodeMsg[nPos] = '\0'; SendToGate(s, szEncodeMsg); } } }