📄 rmtable.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 + -