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

📄 servertable.cpp

📁 Agent in c++ for DragonRaja
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			{
				szDummyMsg[0] = (BYTE)PTCL_NOTIFY_YOU_ARE_CERTIFIED;

				for( pDummyServerData = this->GetServerListHead(); pDummyServerData; pDummyServerData = pDummyServerData->pNextServerData )
				{
					if( pDummyServerData->dwConnectionIndex )
					{
						if( !this->Send( pDummyServerData->dwConnectionIndex, szDummyMsg, 1 ) )
						{
#ifdef __ON_DEBUG
//							_asm int 3;
#endif
						}
					}
				}
			}
		}
	// ------------------
	// 辑滚辆丰 舅覆 菩哦
	// ------------------
		break;
	case PTCL_REPORT_SERVER_DESTROY:
		{
			DWORD dwFinishType = *((DWORD *)pMsg);

			MyLog( LOG_NORMAL, "%s(%d) Reported DESTROY(by %s)", GetTypedServerText(pSender->dwServerType), pSender->wPort, GetFinishTypeText(dwFinishType) );
		}
		break;
	// ------------------
	// 辑滚惑怕 焊绊 菩哦
	// ------------------
	case PTCL_REPORT_SERVER_STATUS:
		// 辑滚 惑怕(STATUS, 荤侩磊 荐) 焊绊 菩哦.
		{
			LP_REPORT_SERVER_STATUS_PACKET pPacket = (LP_REPORT_SERVER_STATUS_PACKET)pMsg;

			// 矫埃 盎脚.
			pSender->dwLastCheckAliveTime = GetTickCount();

			// Status...
			this->SetServerStatus( pSender, pPacket->dwServerStatus );

			// 荤侩磊 荐..
			pSender->dwNumOfUsers = pPacket->dwNumOfUsers;
		}
		break;
	// ----------------------------
	// 辑滚埃 立加惑怕 舅覆 菩哦.
	// ----------------------------
	case PTCL_REPORT_SERVER_CONNECTION_STATUS_CHANGE:
		{
			LP_REPORT_SERVER_CONNECTION_STATUS_PACKET pPacket = (LP_REPORT_SERVER_CONNECTION_STATUS_PACKET)pMsg;
			LP_SERVER_DATA pServerData = this->GetServerData( pPacket->wPort );

			this->SetServerConnectionStatus( pSender, pServerData, pPacket->bConnectionType );
		}
		break;
// ----------------------------
// #endif for __IS_PROXY_SERVER
// ----------------------------
#endif

	default:
		{
#ifdef __ON_DEBUG
//			_asm int 3;
#endif
		return false;
		}
		break;
	}

	return true;
}

bool CServerTable::OnRecvDestroyServerMsg( LP_SERVER_DATA pSender, BYTE bID, char *pMsg, DWORD dwLength )
{
	if( (pSender == this->m_pOwnProxyServerData[0]) || (pSender == this->m_pOwnProxyServerData[0]) )
	{
		this->DestroyServer( (DWORD)FINISH_TYPE_BY_PROXY );
		return true;
	}
	return false;
}

bool CServerTable::ReportServerConnectionStatusChange( LP_SERVER_DATA pServerData, BYTE bConnectionStatus )
{
	char szDummyMsg[MM_MAX_PACKET_SIZE];

	LP_REPORT_SERVER_CONNECTION_STATUS_PACKET pPacket = (LP_REPORT_SERVER_CONNECTION_STATUS_PACKET)(szDummyMsg+1);
	szDummyMsg[0] = PTCL_REPORT_SERVER_CONNECTION_STATUS_CHANGE;

	pPacket->bConnectionType = bConnectionStatus;
	pPacket->wPort = pServerData->wPort;
	if( !this->SendToProxyServer( szDummyMsg, sizeof(BYTE)+sizeof(REPORT_SERVER_CONNECTION_STATUS_PACKET) ) )
	{
		MyLog( LOG_IGNORE, "ReportServerConnectionStatusChange() :: Failed To Notify it To PROXY" );
		return false;
	}

	return true;
}

bool CServerTable::RemoveConnectedServerDataFromHashTable( DWORD dwConnectionIndex )
{
	LP_SERVER_DATA pServerData;
	LP_HASHED_SERVER_DATA pHashedServerData;

	pServerData = GetConnectedServerData( dwConnectionIndex );
	if ( !pServerData || !pServerData->pHashedServerData )
	{
		return false;
	}
	pHashedServerData = pServerData->pHashedServerData;

	// ------------ For DEBUGGING by chan78 (SHOULD BE DELETED)
	LP_HASHED_SERVER_DATA pTest;
	DWORD dwCount = 0;
	for( WORD bb = 0; bb < this->m_wMaxBucketNum; bb++ )
	{
		pTest = this->m_ppServerTable[bb];
		while( pTest )
		{
			ASSERT(pTest);
			dwCount++;
//			if( this->m_ppServerTable[pTest->wPosInHashTable] == NULL )
//				_asm int 3;
			pTest = pTest->pNextHashedServerData;
		}
		
	}
//	if( g_pServerTable->GetNumOfConnectedServers() != dwCount )
//		_asm int 3;
	// ------------


#if defined(__IS_AGENT_SERVER) || defined(__IS_MAP_SERVER)
	// 郴霸 硅沥等 DB Demon捞搁.
	if( pServerData == this->m_pOwnDBDemonData )
	{
		SetServerStatus( STATUS_AWAITING_DB_DEMON_SETTING );
		MyLog( LOG_IMPORTANT, "SERVER Lost given DB DEMON Connection(%d/%d)", pServerData->dwConnectionIndex, pServerData->wPort );

		// Clear DB Demon Pointer.
		this->m_pOwnDBDemonData = NULL;

		this->RequestToSetDBDemon();
	}
#endif

#ifdef __IS_PROXY_SERVER
	if( pServerData->dwServerType == SERVER_TYPE_DB )
	{
		// DB狼 版快 捞 辑滚俊 硅沥等 葛电 辑滚甸狼 DB 硅沥 惑怕甫 官槽促.
		LP_SERVER_DATA pDummyToReset = NULL;
		for( WORD i = 0; i< MAX_SERVER_NUM; i++ )
		{
			pDummyToReset = pServerData->ppUsingServers[i];
			if( pDummyToReset )
			{
				pDummyToReset->pUsingDBDemon = NULL;

				// Modified by chan78 at 2001/02/21
				if( pDummyToReset->dwConnectionIndex && ((pDummyToReset->dwStatus > STATUS_AWAITING_DB_DEMON_SETTING) && (pDummyToReset->dwStatus <= STATUS_ACTIVATED)) )
				{
					this->SetServerStatus( pDummyToReset, STATUS_AWAITING_DB_DEMON_SETTING );
				}
				pDummyToReset = NULL;
			}
		}
	}
	else
	{
		// 扁鸥 辑滚狼 版快 硅沥等 DB Demon狼 府胶飘肺何磐 力芭茄促.
		if( pServerData->pUsingDBDemon )
		{
			LP_SERVER_DATA pDummyToReset = NULL;
			for( WORD i = 0; i< MAX_SERVER_NUM; i++ )
			{
				if( pServerData->pUsingDBDemon->ppUsingServers[i] == pServerData )
				{
					pServerData->pUsingDBDemon->ppUsingServers[i] = NULL;
					break;
				}
			}
		}
		// Modified by chan78 at 2001/02/21
		pServerData->pUsingDBDemon = NULL;
	}
#endif

	// Notify Connection Status Change to Proxy
#ifndef __IS_PROXY_SERVER
	this->ReportServerConnectionStatusChange( pServerData, (BYTE)CONNECTION_STATUS_NOT_CONNECTED );
#endif

#ifdef __IS_PROXY_SERVER
	LP_SERVER_DATA pDummyServer;
	for( pDummyServer = this->GetServerListHead(); pDummyServer; pDummyServer = pDummyServer->pNextServerData )
	{
		if( pDummyServer == pServerData ) continue;

		this->SetServerConnectionStatus( pServerData, pDummyServer, (BYTE)CONNECTION_STATUS_NOT_CONNECTED );
		this->SetServerConnectionStatus( pDummyServer, pServerData, (BYTE)CONNECTION_STATUS_NOT_CONNECTED );
	}
	
	// Added by chan78 at 2001/02/22 :: 荤侩磊荐 努府绢.
	pServerData->dwNumOfUsers = 0;

#endif

	// Processes for Typed Servers Disconnect
	this->OnDisconnectTypedServer( pServerData );

	this->m_dwNumOfConnectedServers--;
	this->m_dwNumOfTypedServers[pServerData->dwServerType]--;

	pServerData->dwConnectionIndex = 0;
	SetServerStatus( pServerData, STATUS_NOT_IN_NETWORK );

	MyLog( LOG_NORMAL, "%s(%d/%d) Has Lost Connection.", GetTypedServerText(pServerData->dwServerType), dwConnectionIndex, pServerData->wPort );

	// Unlink
	if( pHashedServerData->pPrevHashedServerData && pHashedServerData->pNextHashedServerData )
	{
		pHashedServerData->pPrevHashedServerData->pNextHashedServerData = pHashedServerData->pNextHashedServerData;
		pHashedServerData->pNextHashedServerData->pPrevHashedServerData = pHashedServerData->pPrevHashedServerData;
	}
	else if( pHashedServerData->pPrevHashedServerData && !pHashedServerData->pNextHashedServerData )
	{
		pHashedServerData->pPrevHashedServerData->pNextHashedServerData = NULL;
	}
	else if( !pHashedServerData->pPrevHashedServerData && pHashedServerData->pNextHashedServerData )
	{
		this->m_ppServerTable[pHashedServerData->wPosInHashTable] = pHashedServerData->pNextHashedServerData;
		pHashedServerData->pNextHashedServerData->pPrevHashedServerData = NULL;
	}
	else if( !pHashedServerData->pPrevHashedServerData && !pHashedServerData->pNextHashedServerData )
	{
		this->m_ppServerTable[pHashedServerData->wPosInHashTable] = NULL;
	}

	delete pHashedServerData;
	pHashedServerData = NULL;

	return true;
}

bool CServerTable::AddServerDataToList( LP_SERVER_DATA pServerData )
{
	if ( !this->m_pServerListHead )
	{
		this->m_pServerListHead = pServerData;
		this->m_pServerListHead->pNextServerData = NULL;
		this->m_pServerListTail = this->m_pServerListHead;
	} 
	else 
	{
		pServerData->pNextServerData = NULL;
		this->m_pServerListTail->pNextServerData = pServerData;
		this->m_pServerListTail = pServerData;
	}
	return true;
}

bool CServerTable::AddConnectedServerDataToHashTable( LP_SERVER_DATA pServerData, DWORD dwConnectionIndex )
{
	LP_HASHED_SERVER_DATA pHashedServerData;
	LP_HASHED_SERVER_DATA pHashedServerPrv;
	WORD wIndex;

	pServerData->dwConnectionIndex = dwConnectionIndex;

	// Get Position in Hashtable and get it's own pointer
	wIndex = (WORD)(pServerData->wPort % this->m_wMaxBucketNum);

	// Get a new HASHED_SERVER_DATA
	pHashedServerData = new HASHED_SERVER_DATA;
	memset( pHashedServerData, 0, sizeof( HASHED_SERVER_DATA ) );

	// Fill Datas
	pHashedServerData->wPosInHashTable = wIndex;
	pHashedServerData->pServerData = pServerData;

	// Add It to Linked List;
	pHashedServerPrv = this->m_ppServerTable[wIndex];
	if( pHashedServerPrv )
	{
		pHashedServerPrv->pPrevHashedServerData = pHashedServerData;
		pHashedServerData->pNextHashedServerData = pHashedServerPrv;
	}
	this->m_ppServerTable[wIndex] = pHashedServerData;
	pServerData->pHashedServerData = pHashedServerData;

	// Processes for Typed Servers OnConnect
	this->OnConnectTypedServer( pServerData );

	this->m_dwNumOfConnectedServers++;
	this->m_dwNumOfTypedServers[pServerData->dwServerType]++;

	return true;
}

bool CServerTable::ConnectToServer( LP_SERVER_DATA pServerData, DWORD dwConnectType )
{
	if( !this->m_pINet->ConnectToServerWithServerSide( pServerData->szIP, pServerData->wPort, OnConnectServerSuccess, OnFailedToConnectServer, (void *)pServerData ) )
	{
		// 角菩茄 版快!?
		return false;
	}

	// 己傍
	this->SetServerStatus( pServerData, STATUS_TRYING_TO_CONNECT );
	pServerData->dwConnectType = dwConnectType;

	return true;
}

bool CServerTable::ConnectToServer( WORD wServerID, DWORD dwConnectType )
{
	LP_SERVER_DATA pServerData = this->GetServerData( wServerID );
	return this->ConnectToServer( pServerData, dwConnectType );
}

bool CServerTable::StartServer( DWORD dwType )
{
	switch( dwType )
	{
	case TYPE_SERVER_SIDE:
		{
			if ( !(this->m_pINet->StartServerWithServerSide( m_pOwnServerData->szIP, m_pOwnServerData->wPort)) ) // 辑滚 啊悼
				return false;
		}
		break;
	case TYPE_USER_SIDE:
		{
			switch( m_pOwnServerData->dwServerType )
			{
			case SERVER_TYPE_AGENT:
			case SERVER_TYPE_PROXY:
				{
					if ( !(this->m_pINet->StartServerWithUserSide( m_pOwnServerData->szIPForUser, m_pOwnServerData->wPortForUser)) )
						return false;
				}
				break;
			case SERVER_TYPE_MAP:
			case SERVER_TYPE_DB:
				{
					return false;
				}
				break;
			default:
				{
					return false;
				}
			}
		}
		break;
	default:
		{
			return false;
		}
		break;
	}
	return true;
}

bool CServerTable::ConnectToProxyServer()
{
	LP_AWAITING_CONNECTION_RESULT_DATA pResult = this->GetConnectionResultData();
	LP_SERVER_PORT_LIST_PACKET pConnectedList = (LP_SERVER_PORT_LIST_PACKET)(pResult->szAnswer+1);

	DWORD dwCount = 0;
	char szSendMsg[32];
	LP_SERVER_DATA pServerData;

	// Clear pResult & pConnectedList
	pResult->dwConnectionType = CONNECT_TYPE_WITH_PROXY;
	pResult->dwResultCheckedServers = 0;
	pResult->dwToConnectServers = 0;
	pResult->pSender = NULL;
	pConnectedList->wNum = 0;

	for( DWORD dwDummy = PRIMARY_SERVER; dwDummy <= SECONDARY_SERVER; dwDummy++ )
	{
		pServerData = this->m_pOwnProxyServerData[dwDummy];

		if( !pServerData )
			continue;

		if( !pServerData->wPort )
			continue;

		// Already Connected
		if( pServerData->dwConnectionIndex )
		{
			dwCount++;
			continue;
		}

		// Connect...
		if( this->m_pINet->ConnectToServerWithServerSide( pServerData->szIP, pServerData->wPort, OnConnectServerSuccess, OnFailedToConnectServer, (void *)pServerData ) )
		{
			this->SetServerStatus( pServerData, STATUS_TRYING_TO_CONNECT );
			pServerData->dwConnectType = CONNECT_TYPE_WITH_PROXY;
			pResult->dwToConnectServers++;
			dwCount++;
		}

	}

	// 己傍? 角菩?
	if( dwCount )
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool CServerTable::BeginNegotiationWithProxyServer( LP_SERVER_DATA pServerData )
{
	char szSendMsg[32];

	// Proxy Server 绰 立加父 登搁 疵 捞侩且 荐 乐绰 惑怕肺 啊沥茄促.
	this->SetServerStatus( pServerData, STATUS_ACTIVATED );

⌨️ 快捷键说明

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