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

📄 gateinfo.cpp

📁 真正的传奇源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "../def/dbmgr.h"
#include <stdio.h>

extern CWHList< GAMESERVERINFO* >	g_xGameServerList;
extern char							g_szServerList[1024];

int CompareDBString( char *str1, char *str2 )
{
	ChangeSpaceToNull( str1 );
	ChangeSpaceToNull( str2 );

	return strcmp( str1, str2 );
}

int GetCertification() 
{ 
	static long	g_nCertification = 30;

	InterlockedIncrement(&g_nCertification);

	if (g_nCertification >= 0x7FFFFFFF) 
		g_nCertification = 30; 
	
	return g_nCertification; 
}

/* **************************************************************************************

		Close
		
		PURPOSE : Send packet to login gate server.
		
		NOTE
		
		1. Packet construction : Packet % + client socket handle + / # + packet + ! + $

   ************************************************************************************** */

void CGateInfo::Close()
{
	PLISTNODE		pListNode;
	CUserInfo*		pUserInfo;

	if (xUserInfoList.GetCount())
	{
		pListNode = xUserInfoList.GetHead();

		while (pListNode)
		{
			pUserInfo = xUserInfoList.GetData(pListNode);

			if (pUserInfo)
			{
				delete pUserInfo;
				pUserInfo = NULL;

				pListNode = xUserInfoList.RemoveNode(pListNode);

				continue;
			}

			pListNode = xUserInfoList.GetNext(pListNode);
		}
	}

	closesocket(sock);
	sock = INVALID_SOCKET;
}

/* **************************************************************************************

		SendToGate 
		
		PURPOSE : Send packet to login gate server.
		
		NOTE
		
		1. Packet construction : Packet % + client socket handle + / # + packet + ! + $

   ************************************************************************************** */

void CGateInfo::SendToGate(SOCKET cSock, char *pszPacket)
{
	char	szData[256];
	WSABUF	buf;
	DWORD	dwSendBytes;
	
//	wsprintf(szData, _TEXT("%%%d/#%s!$"), (int)cSock, pszPacket);
	
	int nLen = memlen(pszPacket) - 1;

	szData[0] = '%';
	
	char *pszNext = ValToAnsiStr((int)cSock, &szData[1]);
	
	*pszNext++ = '/';
	*pszNext++ = '#';

	memmove(pszNext, pszPacket, nLen);

	pszNext += nLen;

	*pszNext++ = '!';
	*pszNext++ = '$';
	*pszNext++ = '\0';

	buf.len = pszNext - szData;
	buf.buf = szData;

	WSASend(sock, &buf, 1, &dwSendBytes, 0, NULL, NULL);
}

/* **************************************************************************************

		MakeNewUser
		
		PURPOSE : 
		
		NOTE

   ************************************************************************************** */

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 = '\0';
		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); 
	}
}

/* **************************************************************************************

		ReceiveServerMsg
		
		PURPOSE : 
		
		NOTE

   ************************************************************************************** */

void CGateInfo::ReceiveServerMsg(char *pszPacket)
{
	char		*pszPos;
	int			nCertification;
	int			nLen = memlen(pszPacket);

	if (pszPos = (char *)memchr(pszPacket, '/', nLen))
	{
		*pszPos++ = '\0';
		nCertification = AnsiStrToVal(pszPos);

		char szQuery[256];
		sprintf( szQuery, 
			"UPDATE TBL_ACCOUNT SET FLD_CERTIFICATION=%d WHERE FLD_LOGINID='%s'", 
			nCertification, pszPacket );

		CRecordset *pRec = GetDBManager()->CreateRecordset();
		pRec->Execute( szQuery );
		GetDBManager()->DestroyRecordset( pRec );
	}
}

void CGateInfo::ReceiveOpenUser(char *pszPacket)
{
	char	*pszPos;
	int		nSocket;
	int		nLen = memlen(pszPacket);

	if (pszPos = (char *)memchr(pszPacket, '/', nLen))
	{
		nSocket = AnsiStrToVal(pszPacket);

		pszPos++;

		CUserInfo* pUserInfo = new CUserInfo;

		if (pUserInfo)
		{
			MultiByteToWideChar(CP_ACP, 0, pszPacket, -1, pUserInfo->szSockHandle, sizeof(pUserInfo->szSockHandle)/sizeof(TCHAR));
			MultiByteToWideChar(CP_ACP, 0, pszPos, -1, pUserInfo->szAddress, sizeof(pUserInfo->szAddress)/sizeof(TCHAR));

			pUserInfo->sock					= nSocket;
			pUserInfo->nCertification		= 0;
			pUserInfo->nClientVersion		= 0;
			pUserInfo->fSelServerOk			= FALSE;

			ZeroMemory(pUserInfo->szUserID, sizeof(pUserInfo->szUserID));

			xUserInfoList.AddNewNode(pUserInfo);

			InsertLogMsgParam(IDS_OPEN_USER, pUserInfo->szAddress);
		}
	} 
}

/* **************************************************************************************

		ReceiveCloseUser
		
		PURPOSE : 
		
		NOTE

   ************************************************************************************** */

void CGateInfo::ReceiveCloseUser(char *pszPacket)
{
	int nSocket = AnsiStrToVal(pszPacket);
}

/* **************************************************************************************

		ReceiveSendUser
		
		PURPOSE : 
		
		NOTE

   ************************************************************************************** */

void CGateInfo::ReceiveSendUser(char *pszPacket)
{
	char	*pszPos;
	int		nSocket;
	int		nLen = memlen(pszPacket);

	if ((pszPos = (char *)memchr(pszPacket, '/', nLen)))
	{
		nSocket = AnsiStrToVal(pszPacket);

		pszPos++;

		_LPTSENDBUFF lpSendUserData = new _TSENDBUFF;

		lpSendUserData->sock		= (SOCKET)nSocket;

		memmove(lpSendUserData->szData, pszPos, memlen(pszPos));

		g_SendToGateQ.PushQ((BYTE *)lpSendUserData);
	}
}

/* **************************************************************************************

		ProcSelectServer
		
		PURPOSE : 
		
		NOTE

⌨️ 快捷键说明

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