⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 distributedbmsgparser.cpp

📁 [Server]Distribute.rar这个是分发服务器的源码
💻 CPP
字号:
#include "stdafx.h"
#include "DistributeDBMsgParser.h"
#include "DataBase.h"
#include "CommonDBMsgParser.h"
#include "UserTable.h"
#include "ServerTable.h"
#include "Network.h"
#include "UserManager.h"

extern int g_nServerSetNum;
extern DWORD g_dwMaxUser;

DBMsgFunc g_DBMsgFunc[] =
{
	NULL,
	RLoginCheckQuery,
	RIpCheckQuery,			/// eIpCheckQuery (GM酒捞乔俊 措茄 眉农)
	RCheckMaxUser,
	RLoginCheckQueryTest,
	
	RTest,
};

void LoginCheckInit()
{
	g_DB.FreeQuery(0, 0, "EXEC %s", "MP_CHARACTER_LoginInit");
/* 酒流 眠啊窍瘤 富巴... 橇肺矫廉 荐沥饶 眠啊 (LBS)
	char txt[128];
	sprintf(txt, "EXEC %s %d", "up_Server_ResetLoginMember", g_nServerSetNum);
	g_DB.LoginQuery(eQueryType_FreeQuery, 0, 0, txt);
*/
}


/*
void LoginCheckDelete(DWORD UserID)//, DWORD dwConnectionIndex)
{
	char txt[128];
	sprintf(txt, "EXEC %s %d", "Up_Member_CheckOut", UserID);
	g_DB.LoginQuery(eQueryType_FreeQuery, eNull, 0, txt);
}


BOOL LoginCheckQuery(char* id, char* pw, DWORD AuthKey, DWORD dwConnectionIndex)
{
	char guery[128];
	// id,pw,AuthKey,ServerGroupNum
	sprintf(guery, "EXEC %s \'%s\', \'%s\', %d, %d", "Up_Member_CheckIn", id, pw, AuthKey, 1);
	if(g_DB.LoginQuery(eQueryType_FreeQuery, eLoginCheckQuery, dwConnectionIndex, guery) == FALSE)
	{
		g_Console.Log(eLogDisplay,4,"DB is Busy  ID:%d  ConnectionIndex:%d",id,dwConnectionIndex);
		return FALSE;
	}
	
	g_Console.Log(eLogDisplay,4,"IDPW_QUERY   ID: %s,  ConnectionIndex: %d",id,dwConnectionIndex);
	return TRUE;
}
*/

BOOL IPCheckQuery(char* ip, DWORD AuthKey, DWORD dwConnectionIndex)
{
	char query[128];
	sprintf(query, "EXEC %s \'%s\', %d", "Up_Ip_CheckIn", ip, AuthKey);
	if(g_DB.LoginQuery(eQueryType_FreeQuery, eIpCheckQuery, dwConnectionIndex, query) == FALSE)
	{
		g_Console.Log(eLogDisplay,4,"DB is Busy(IP_CHECK)  IP:%s  ConnectionIndex:%d", ip, dwConnectionIndex);
		return FALSE;
	}

//	g_Console.Log(eLogDisplay,4,"IP_QUERY   IP: %s,  ConnectionIndex: %d", ip, dwConnectionIndex);
	return TRUE;
}

void LoginError(DWORD dwConnectionIdx, DWORD AuthKey,DWORD ErrorCode,DWORD dwParam)
{	
	MSG_DWORD2 msguser;
	msguser.Category = MP_USERCONN;
	msguser.Protocol = MP_USERCONN_LOGIN_NACK;
	msguser.dwData1 = ErrorCode;
	msguser.dwData2 = dwParam;
	
	g_pUserTable->SendToUser(dwConnectionIdx, AuthKey, &msguser, sizeof(msguser) );

	
//	g_Console.Log(eLogDisplay,4,"  LOGINERROR   Errorcode: %d,  ConnectionIndex: %d",ErrorCode,dwConnectionIdx);
}

void RIpCheckQuery(LPQUERY pData, LPDBMESSAGE pMessage)
{
	if(pMessage->dwResult == 0)
	{
		// DB Error(DB is busy)
		return;
	}

	WORD Ecode =atoi((char*)pData->Data[0]);
	DWORD AuthKey = atoi((char*)pData->Data[1]);

	DWORD dwConnectionIdx	= pMessage->dwID;
	USERINFO* pUserInfo		= g_pUserTable->FindUser(dwConnectionIdx);

	if( pUserInfo == NULL )	//捞固 唱艾促.
		return;

	if( pUserInfo->dwUniqueConnectIdx != AuthKey )	// 捞固 唱啊绊 促弗 逞捞 甸绢柯 版快
		return;

	if( Ecode == 0 )
	{
		LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_INVALID_IP );
		LoginCheckDelete( pUserInfo->dwUserID );
		//LoginCheckDelete( pUserInfo->dwUserID);
		return;
	}

	// 己傍
	SERVERINFO* FastInfo = g_pServerTable->GetFastServer( AGENT_SERVER );
	
	if(FastInfo == NULL)
	{
		LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_NOAGENTSERVER );
		LoginCheckDelete( pUserInfo->dwUserID );
		pUserInfo->dwUserID = 0;
		return;
	}
				
	MSG_DWORD2BYTE msg;
	msg.Category	= MP_USERCONN;
	msg.Protocol	= MP_USERCONN_NOTIFY_USERLOGIN_SYN;
	msg.dwObjectID	= pUserInfo->dwUserID;
	msg.dwData1		= AuthKey;
	msg.dwData2		= dwConnectionIdx;
	msg.bData		= pUserInfo->UserLevel;
				
	g_Network.Send2Server(FastInfo->dwConnectionIndex,(char*)&msg,sizeof(msg));
}

DWORD testTime[1024];
BOOL LoginCheckQueryTest(char* id, char* pw, DWORD AuthKey, DWORD dwConnectionIndex)
{
	char guery[128];
	sprintf(guery, "EXEC %s \'%s\', \'%s\', %d, %d", "Up_Member_CheckIn", id, pw, AuthKey, 1);
	if(g_DB.LoginQuery(101, eLoginCheckQueryTest, dwConnectionIndex, guery) == FALSE)
	{
		g_Console.Log(eLogDisplay,4,"DB is Busy  ID:%d  ConnectionIndex:%d",id,dwConnectionIndex);
		return FALSE;
	}
	
	g_Console.Log(eLogDisplay,4,"IDPW_QUERY   ID: %s,  ConnectionIndex: %d",id,dwConnectionIndex);
	return TRUE;
}

void	RLoginCheckQueryTest(LPQUERY pData, LPDBMESSAGE pMessage)
{
	DWORD AuthKey =atoi((char*)pData->Data[2]);
	
	testTime[AuthKey-1] = GetTickCount() - pMessage->dwID;

	g_Console.Log(eLogDisplay,4,"IDPW TestReceived    ID: %d  Time: %d",AuthKey,testTime[AuthKey-1]);

	if(AuthKey == 1024)
	{
		FILE* fp = fopen("test.txt","w");
		for(int n=0;n<1024;++n)
			fprintf(fp,"%d  ElapsedTime: %d\n",n+1,testTime[n]);
		fclose(fp);
	}
}

//* MemberDB 背眉 累诀 2004.03.22
void LoginCheckDelete(DWORD UserID)
{
	char txt[128];
	sprintf(txt, "EXEC %s %d", "Up_GameLogout", UserID);
	g_DB.LoginQuery(eQueryType_FreeQuery, eNull, 0, txt);
}
//*/

//* MemberDB 背眉 累诀 2004.03.22
BOOL LoginCheckQuery(char* id, char* pw, char* ip, WORD ServerNo, DWORD AuthKey, DWORD dwConnectionIndex, DWORD dwMaxUser, WORD ServerNum)
{
	char guery[128];
	// id,pw,AuthKey,ServerGroupNum
	// MaxUser八荤且锭
	sprintf(guery, "EXEC %s \'%s\', \'%s\', \'%s\', %d, \'%d\', %d, %d, %d", 
						"up_gameloginadult_free", id, pw, ip, ServerNo, AuthKey, dwMaxUser, gUserMGR.GetLimitAge(), ServerNum);

	if(g_DB.LoginQuery(eQueryType_FreeQuery, eLoginCheckQuery, dwConnectionIndex, guery, FALSE) == FALSE)
	{
		g_Console.Log(eLogDisplay,4,"DB is Busy  ID:%d  ConnectionIndex:%d",id,dwConnectionIndex);
		LoginError( dwConnectionIndex, AuthKey, LOGIN_ERROR_DISTSERVERISBUSY );
		return FALSE;
	}

	return TRUE;
}
//*/

//* MemberDB 背眉 累诀 2004.03.22
void RLoginCheckQuery(LPQUERY pData, LPDBMESSAGE pMessage)
{
	DWORD stateNo = atoi((char*)pData->Data[0]);
	WORD ServerNo = atoi((char*)pData->Data[1]);
	DWORD UserIdx = atoi((char*)pData->Data[2]);
/////////////////////////////////////////////////////////
// 搬力 包访 函荐 (酒流 荤侩救窃.)
//	WORD Type = atoi((char*)pData->Data[3]);	//搬力规侥
//	WORD time = atoi((char*)pData->Data[4]);	//巢篮矫埃??
//	WORD bTen = atoi((char*)pData->Data[5]);	//眉氰魄咯何
/////////////////////////////////////////////////////////
	DWORD AuthKey = atoi((char*)pData->Data[6]);
	BYTE UserLevel = atoi((char*)pData->Data[7]);
	WORD AgentNo = atoi((char*)pData->Data[8]);
	DWORD dwConnectionIdx = pMessage->dwID;


	USERINFO* pUserInfo = g_pUserTable->FindUser(dwConnectionIdx);

	if(pUserInfo == NULL)		// 捞固 唱埃版快
	{
		LoginCheckDelete(UserIdx);
		return;
	}

	ASSERT(pUserInfo->dwConnectionIndex == dwConnectionIdx);
	if(pUserInfo->UserLevel == eUSERLEVEL_PROGRAMMER)
	{
		//////////////////////////////////////////////////////////////////////////
		// testcode
		FILE* fp = fopen("loginchk.txt","a");
		fprintf(fp,"RLOGIN_Q %d\t%d\t%d\t%d\t%d\n",UserIdx,dwConnectionIdx,(DWORD)pUserInfo,pUserInfo->dwUniqueConnectIdx,AuthKey);
		fclose(fp);
		//////////////////////////////////////////////////////////////////////////
	}

	if(pUserInfo->dwUniqueConnectIdx != AuthKey)		// 捞固 唱啊绊 促弗 逞捞 甸绢柯 版快
	{
		LoginCheckDelete(UserIdx);
		return;
	}

	pUserInfo->dwUserID = UserIdx;
	pUserInfo->UserLevel = UserLevel;
	pUserInfo->State = stateNo;

	// 捞镑俊辑 父距 肋给等 UserIdx啊 逞绢柯 版快

//	g_Console.Log(eLogDisplay, 4, "ID/PW Check Received dwConnectionIdx:%d",dwConnectionIdx);
	
	switch(stateNo)
	{
	case 1: // 立加 己傍.
		{
			// 蜡历饭骇 八荤
			if(gUserMGR.IsValidUserLevel(UserLevel) == FALSE)
			{
				LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_INVALIDUSERLEVEL);

				DisconnectUser(dwConnectionIdx);
				LoginCheckDelete(UserIdx); // 荐沥夸!!!
				return;
			}
//			g_Console.Log(eLogDisplay, 4, "  ID/PW Success : dwConnectionIdx: %d",dwConnectionIdx);
			
			if( UserLevel == eUSERLEVEL_GM )
			{
				char strIP[16] = {0,};
				WORD wPort;
				g_Network.GetUserAddress( dwConnectionIdx, strIP, &wPort );

				IPCheckQuery( strIP, AuthKey, dwConnectionIdx );
			}
			else
			{	
				SERVERINFO* pAgentServer = g_pServerTable->GetServer(AGENT_SERVER, AgentNo);
				if(pAgentServer == NULL)
				{
					LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_NOAGENTSERVER);
					DisconnectUser(dwConnectionIdx);
					LoginCheckDelete(UserIdx);	//OnDisconnectUser俊辑 龋免窍绰单.. 趣矫唱秦辑.
					return;
				}

				MSG_DWORD2BYTE msg;
				msg.Category	= MP_USERCONN;
				msg.Protocol	= MP_USERCONN_NOTIFY_USERLOGIN_SYN;
				msg.dwObjectID	= UserIdx;
				msg.dwData1		= AuthKey;
				msg.dwData2		= dwConnectionIdx;
				msg.bData		= UserLevel;
				
				g_Network.Send2Server(pAgentServer->dwConnectionIndex,(char*)&msg,sizeof(msg));
			}
		}
		break;
	case 2: // ID绝澜.
		{
			LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_WRONGIDPW);
		}
		break;
	case 3: // 厚剐锅龋坷幅.
		{
			LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_WRONGIDPW);			
		}
		break;
	case 4: // 霸烙俊 立加吝.
		{
			if(g_nServerSetNum == ServerNo)
			{
				MSG_DWORD msg;
				msg.Category = MP_USERCONN;
				msg.Protocol = MP_USERCONN_NOTIFY_OVERLAPPEDLOGIN;
				msg.dwData = UserIdx;
				g_Network.Broadcast2AgentServer((char*)&msg,sizeof(msg));
			
				LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_OVERLAPPEDLOGIN,0);
			}
			else
			{
				LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_OVERLAPPEDLOGININOTHERSERVER,ServerNo);
			}
		}
		break;

	case 5: // 喉钒等 拌沥. @state_num = 6捞搁 拌沥喉钒 (昆 包府葛靛俊辑 荤侩)
		{
			LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_BLOCKUSERLEVEL);
		}
		break;

	case 7: // DB Connection Error
		{
			ASSERTMSG(0, "login check error ret 0");
		}
		break;

	case 8: // 牢盔檬苞
		{			
			LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_MAXUSER );
		}
		break;
	case 14:
		{
			LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_NOT_CLOSEBETAWINNER );
		}
		break;
	case 15: //己牢挤俊 固己斥磊啊 甸绢坷妨绊 沁促.
		{
			LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_MINOR_INADULTSERVER );
		}
		break;
	case 50: // 雀盔呕硼茄 拌沥烙.
		{
			LoginError(dwConnectionIdx,AuthKey,LOGIN_ERROR_SECEDEDACCOUNT);
		}
		break;
	default:
		{
			ASSERT(0);
		}
	}
}
//*/

BOOL CheckMaxUser( char* id, char* pw, WORD ServerNo, DWORD AuthKey, DWORD dwConnectionIdx )
{
	char guery[128];
	sprintf( guery, "EXEC %s \'%s\', \'%s\', %d, %d", "Up_CheckMaxUser", id, pw, ServerNo, AuthKey );

	if( g_DB.LoginQuery(eQueryType_FreeQuery, eCheckMaxUser, dwConnectionIdx, guery) == FALSE )
	{
		g_Console.Log( eLogDisplay, 4, "DB is Busy" );
		return FALSE;
	}

	return TRUE;
}

void RCheckMaxUser( LPQUERY pData, LPDBMESSAGE pMessage )
{
	char id[20] = {0,};
	char pwd[20] = {0,};

	DWORD MaxUser = atoi((char*)pData->Data[0]);
	DWORD AuthKey = atoi((char*)pData->Data[3]);
	SafeStrCpy(id, (char*)pData->Data[1], 20);
	SafeStrCpy(pwd, (char*)pData->Data[2], 20);

	DWORD dwConnectionIdx = pMessage->dwID;

	USERINFO* pUserInfo = g_pUserTable->FindUser(dwConnectionIdx);
	if(pUserInfo == NULL)		// 捞固 唱埃版快
		return;
	if(pUserInfo->dwUniqueConnectIdx != AuthKey)		// 捞固 唱啊绊 促弗 逞捞 甸绢柯 版快
		return;

	if( g_dwMaxUser <= MaxUser )
	{
		LoginError( dwConnectionIdx, AuthKey, LOGIN_ERROR_MAXUSER );
		return;
	}			
				
	// MemberDB 背眉俊 蝶弗 2004.03.22
	char ip[20] = {0,};
	WORD port = 0;
	g_Network.GetUserAddress(dwConnectionIdx, ip, &port);
	
//	LoginCheckQuery(id, pwd, ip, g_nServerSetNum, AuthKey, dwConnectionIdx);
}


enum CHItem			// 某腐磐 酒捞袍 沥焊甫 罐阑锭 荤侩
{
	eCI_ObjectID = 0, eCI_DBIDX, eCI_IDX, eCI_Position, eCI_QPosition, eCI_Durability
};

void RTest(LPQUERY pData, LPDBMESSAGE pMessage)
{
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -