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

📄 rmtable.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
字号:
#include "inetwork.h"
#include "RMTable.h"


CRMTable* g_pRMTable;
extern I4DyuchiNET* g_pINet;

extern void __stdcall OnConnectListenerSuccess( DWORD dwConnectionIndex, void *pData );
extern void __stdcall OnConnectListenerFail( void *pData );


CRMTable::CRMTable(DWORD num)
{
	m_dwMaxBucketNum = num;

	m_ppInfoTable = NULL;

	m_ppInfoTable = new RMCLIENT_INFO*[num];	//m_ppInfoTable篮 (蜡历牢器 郴侩狼 林家蔼)狼 林家蔼阑 啊福挪寸.. 
	memset(m_ppInfoTable,0,sizeof(RMCLIENT_INFO*)*num);

	m_ListenerTable.Create(2);		//ConnectTable 积己窍绊..   2俺..   窍唱绰 立加 救茄 Listener, 窍唱绰 立加茄 Listener

	m_bClientConnect = 0;
	m_CertainIPNum = 0;
	memset(m_RMCertIP, 0, sizeof(m_RMCertIP));
}

CRMTable::~CRMTable()
{
	RemoveAllClientTable();

	if (m_ppInfoTable)
	{
		delete [] m_ppInfoTable;
		m_ppInfoTable = NULL;
	}
}

bool CRMTable::AddClient(DWORD dwConnectionIndex, PACKET_RM_LOGIN* packet)
{
	if (!dwConnectionIndex)
		return FALSE;

	RMCLIENT_INFO* info = new RMCLIENT_INFO;	
	memset(info, 0, sizeof(RMCLIENT_INFO));		

	//立加沥焊 涝仿 
	info->bConnectType = RM_TYPE_TOOL;
	info->ConnectionIndex = dwConnectionIndex;
	//Modified by KBS 020330
	info->IPAddress = g_pINet->GetUserAddress(dwConnectionIndex)->sin_addr.s_addr;	//sin_addr.S_un.S_addr;	
	//
	info->dwID = info->IPAddress;
	strcpy(info->szLoginID, packet->ID);
	strcpy(info->szName, packet->Name);

		
	g_pINet->SetServerInfo(dwConnectionIndex,(void*)info);	//DLL俊 Listener 沥焊 林家蔼 setting 矫糯...

	AddClientInfo(info);		//HashTable俊 眠啊
	return true;
}

BYTE CRMTable::GetClientNum()	//立加茄 努扼捞攫飘 箭磊甫 府畔 
{
	return m_bClientConnect;
}

void CRMTable::AddClientInfo(RMCLIENT_INFO* info)
{													
	DWORD index = info->dwID%m_dwMaxBucketNum;		
	

	m_bClientConnect++;

	if (!m_ppInfoTable[index])	//m_ppInfoTable[index] 俊 郴侩捞 绝栏搁 褒龋 救栏肺.
	{
		m_ppInfoTable[index] = info;
		info->pNextUserInfo = NULL;
		info->pPrvUserInfo = NULL;
		return;
	}


	RMCLIENT_INFO* cur = m_ppInfoTable[index];
	RMCLIENT_INFO* prv = NULL;
	while (cur)
	{
		prv = cur;
		cur = cur->pNextUserInfo;
	}
	
	cur = prv->pNextUserInfo = info;
	cur->pPrvUserInfo = prv;
	cur->pNextUserInfo = NULL;
}

RMCLIENT_INFO* CRMTable::GetClientInfo(DWORD dwID)
{
	DWORD index = dwID%m_dwMaxBucketNum;

	RMCLIENT_INFO* cur = m_ppInfoTable[index];

	while (cur)
	{
		if (cur->dwID == dwID)
		{
			return cur;
		}
		cur = cur->pNextUserInfo;
	}
	return NULL;
}

void CRMTable::RemoveClient(DWORD dwConnectionIndex)
{
	//Modified by KBS 020330
	RMCLIENT_INFO* pInfo = (RMCLIENT_INFO*)g_pINet->GetUserInfo(dwConnectionIndex);
	RemoveClientID(pInfo->dwID);
}


void CRMTable::RemoveClientID(DWORD dwID)
{
	DWORD index = dwID%m_dwMaxBucketNum;

	RMCLIENT_INFO* cur  = m_ppInfoTable[index];
	RMCLIENT_INFO* next = NULL;
	RMCLIENT_INFO* prv  = NULL;
	
	while (cur)
	{
		prv = cur->pPrvUserInfo;
		next = cur->pNextUserInfo;
		if (cur->dwID == dwID)
		{
			if (!prv)	// if head
				m_ppInfoTable[index] = next;	
			else 
				prv->pNextUserInfo = next;
			
			if (next)
				next->pPrvUserInfo = prv;

			m_bClientConnect--;

			if(cur)	
				delete cur;		

			cur = NULL;
			return;

		}
		cur = cur->pNextUserInfo;
	}
	return;
}


void CRMTable::RemoveAllClientTable()
{
	RMCLIENT_INFO* cur = NULL;
	RMCLIENT_INFO* next = NULL;
	for (DWORD i=0; i<m_dwMaxBucketNum; i++)
	{
		cur = m_ppInfoTable[i];
		while (cur)
		{
			next = cur->pNextUserInfo;
			delete cur;
			cur = next;
		}
		m_ppInfoTable[i] = NULL;
	}

	m_bClientConnect = 0;	//Client 立加荐 
}


void CRMTable::BroadcastAllRMClient(char* pMsg, DWORD dwLength)
{
	
	RMCLIENT_INFO* cur = NULL;
	RMCLIENT_INFO* next = NULL;
	for (DWORD i=0; i<m_dwMaxBucketNum; i++)
	{
		cur = m_ppInfoTable[i];
		while (cur)
		{
			next = cur->pNextUserInfo;
			g_pINet->SendToUser(cur->ConnectionIndex, pMsg, dwLength, FLAG_SEND_NOT_ENCRYPTION);
			cur = next;
		}
	}
}


//Disconnect等 葛电 Listener俊 立加阑 矫档茄促.
void CRMTable::ConnectAllDisconnectedListener()
{
	RM_LISTENER_INFO* cur = NULL;
	RM_LISTENER_INFO* next = NULL;
	
	cur = m_ListenerTable.m_ppInfoTable[0];		//0捞 立加 救茄 惑怕捞聪...
	while (cur)
	{
		next = cur->pNextInfo;
		
		if(!m_ListenerTable.CheckDuplicateIP(cur->szIP, 0))	//吝汗登绰芭巴捞 酒匆锭父.. 
			m_ListenerTable.Add( cur->szIP , 0);	//立加 救茄惑怕绰 滴锅掳 牢磊蔼 0栏肺 Add
		
		g_pINet->ConnectToServerWithServerSide( cur->szIP , PROXY_SERVER_CONNECTION_PORT, OnConnectListenerSuccess, OnConnectListenerFail, cur->szIP ); 
		//}
		cur = next;
	}
}

BOOL CRMTable::BroadcastAllListener(char *packet, DWORD dwLength)
{
	RM_LISTENER_INFO* cur = NULL;
	RM_LISTENER_INFO* next = NULL;
	
	cur = m_ListenerTable.m_ppInfoTable[ 1 ];		//1捞 立加 茄 惑怕捞聪...
	while (cur)
	{
		next = cur->pNextInfo;
						
		g_pINet->SendToServer(cur->dwConnectionIndex, packet, dwLength, FLAG_SEND_NOT_ENCRYPTION);
			
		cur = next;
	}

	return TRUE;
}

/*
//概俺函荐俊 瘤沥茄 辆幅狼 辑滚Listener肺父 Broadcast
BOOL CRMTable::BroadcastEachListener(DWORD dwServerType, char *packet, DWORD dwLength)
{
	LP_SERVER_DATA pServerData;
	for( pServerData = this->m_pServerListHead; pServerData; pServerData = pServerData->pNextServerData )
	{
		if( pServerData->dwServerType == dwServerType )
		{
			g_pINet->SendToServer( pServerData->dwConnectionIndex , packet, dwLength, FLAG_SEND_NOT_ENCRYPTION);
		}
	}
	return TRUE;
}
*/

//ini颇老肺 何磐 RMTool Login啊瓷茄 IP甫 罐酒柯促..
BOOL CRMTable::GetCertainIPFromIni()
{
	char path[ MAX_PATH ];
	
	sprintf(path,".\\ProxyServer.ini");                          
	m_CertainIPNum = (DWORD)GetPrivateProfileInt( "RMTool_Info", "CertainIPNum ", 0, path );
	if( m_CertainIPNum <= 0 ) 
		return FALSE;
		
	for(DWORD i = 0 ; i < m_CertainIPNum ; i ++ )
	{	
		char	keyname[ 32 ];
		sprintf( keyname, "CertainIP%d", i+1 );
		::GetPrivateProfileString( "RMTool_Info", keyname, "", m_RMCertIP[ i ], sizeof(m_RMCertIP[ i ]), path );
	}	

	return TRUE;
}

//立加 啊瓷茄 IP牢瘤 眉农..
BOOL CRMTable::CheckCertainIP(DWORD dwConnectionIndex, char* ip)
{
	// YGI		// 捞吝 厚背
	return true;
	//Connection俊辑 掘篮 IP
	char szConnectionIP[16];	memset(szConnectionIP , 0, 16);
	WORD wPort;
	g_pINet->GetUserAddress(dwConnectionIndex, szConnectionIP, &wPort);
	
	if(strcmp(szConnectionIP, ip))
		return FALSE;
	
	for(int i=0 ; i<m_CertainIPNum ; i++)
	{
		if(!strcmp(m_RMCertIP[i],ip))
			return TRUE;
	}
	
	return FALSE;
}

//秦寸 IP啊 Listener table俊 粮犁 窍绰啊甫 眉农茄促...    吝汗 救登霸..
BOOL CRMTable::CheckExistIP(char *szIp)
{
	RM_LISTENER_INFO* cur = NULL;
	RM_LISTENER_INFO* next = NULL;
	
	for(int i=0; i<2 ; i++)
	{
		cur = m_ListenerTable.m_ppInfoTable[ i ];		
		while (cur)
		{
			next = cur->pNextInfo;
							
			if(!strcmp(cur->szIP, szIp))	return TRUE;
						
			cur = next;
		}
	}

	return FALSE;
}


//霸烙 辑滚 器飘甫 捞侩秦 Listener狼 ConnectionIndex甫 掘绢柯促. 
DWORD CRMTable::GetListenerConnectionIndex( WORD wGameServerPort )
{
	//霸烙 辑滚狼 Data甫 茫酒晨..
	LP_SERVER_DATA pServerData;
	for( pServerData = g_pServerTable->m_pServerListHead; pServerData; pServerData = pServerData->pNextServerData )
	{
		if( pServerData->wPort == wGameServerPort )
		{
			break;
		}
	}

	if(!pServerData)	return 0;

	RM_LISTENER_INFO* cur = NULL;
	RM_LISTENER_INFO* next = NULL;
	cur = m_ListenerTable.m_ppInfoTable[ 1 ];		//1捞 立加 茄 惑怕捞聪...
	while (cur)
	{
		next = cur->pNextInfo;
		if( !strcmp(cur->szIP, pServerData->szIP) )	//霸烙辑滚 IP客 ListenerIP啊 鞍栏搁 
		{
			return cur->dwConnectionIndex;			//Listener狼 dwConnectionIndex甫 府畔 
		}
		cur = next;
	}
	return 0;
}

⌨️ 快捷键说明

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