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

📄 serversession.cpp

📁 奇迹世界data 服务器代码,研究游戏的朋友有帮助
💻 CPP
字号:
#include "stdafx.h"
#include ".\ServerSession.h"
#include <Global.h>
#include "QueryPoolFactory.h"
#include "ServerSessionManager.h"
#include "DBProxyServer.h"
#include "DBUserManager.h"
#include <FileParser.h>
#include <Protocol_ServerCommon.h>
#include <PacketStruct_ServerCommon.h>

VOID CallBackMessage( char * szMessage );
VOID CallBackQueryResult( DWORD dwIndex, QueryResult * pData );

ServerSession::ServerSession()
	:	m_dwSessionIndex ( 0 ),
		m_wConnectPort ( 0 ),
		m_bIsConnector ( FALSE ),
		m_bIsTriedToConnect ( FALSE ),
		m_dwLastHeartbeatTick ( 0 ),
		m_bIsConnected ( FALSE )
{
}

ServerSession::~ServerSession()
{
}

VOID ServerSession::init()
{
	SolarDatabaseDesc db_desc;
	//db_desc.DataBaseModuleType			= DBCInterfaceType_OLEDB;
	db_desc.DataBaseModuleType			= DBCInterfaceType_ODBC;
	db_desc.dwQueryPoolSize				= 2000;
	db_desc.wQueryProcessorNum			= 1;
	
	// 瞒饶 ODBC技泼俊辑 沥焊甫 佬绢啊扁 锭巩俊 鞘夸绝绰 沥焊烙!!
	if( 0 != strcmp(g_DBProxyServer.GetFileParser()->GetServerEnv()->pszSQLServerIP, "") )
		db_desc.pszDatabaseIP				= g_DBProxyServer.GetFileParser()->GetServerEnv()->pszSQLServerIP;
	else
		db_desc.pszDatabaseIP			= "10.11.3.6";


	db_desc.pszDatabaseName				= "SUNOnline";
	db_desc.pszUserName					= "SunDevAdmin";
	db_desc.pszUserPassword				= "Tjs123!@#";
	db_desc.fnErrorMessage				= CallBackMessage;
	db_desc.fnQueryResult				= CallBackQueryResult;
	if( !m_DB.Initialize( db_desc ) )
	{
		ASSERT ( !"叼厚 檬扁拳 角菩" );
	}
}

VOID ServerSession::DBQuery( Query * pQuery ) 
{ 
	m_DB.DBQuery( pQuery ); 
}

VOID ServerSession::release()
{
	m_DB.Release();
	m_dwSessionIndex			= 0;
	m_wConnectPort				= 0;
	m_bIsTriedToConnect			= FALSE;
	m_dwLastHeartbeatTick		= GetTickCount();

	m_strConnectIP.clear();
	_setIsConnector( FALSE );
}

VOID ServerSession::Update()
{
	m_DB.Update();

	if( IsConnected() && _isConnector() )
	{
		// heartbeat 焊郴扁
		DWORD dwCurTick = GetTickCount();
		if( dwCurTick - m_dwLastHeartbeatTick > _HEARTBEAT_DELAY_BETWEEN_SERVER )
		{
			m_dwLastHeartbeatTick = dwCurTick;

			MSG_HEARTBEAT msg;
			msg.m_byCategory		= 0;
			msg.m_byProtocol		= SERVERCOMMON_HEARTBEAT;
			Send( (BYTE*)&msg, sizeof(MSG_HEARTBEAT) );
		}
	}
}

VOID ServerSession::OnConnect( BOOL bSuccess, DWORD dwNetworkIndex )
{
	if( bSuccess )
	{
		_setConnected( TRUE );
		_setIsConnector( TRUE );
		SetSessionIndex( dwNetworkIndex );
		ServerSessionManager::Instance()->AddServer( this );
		SendServerType();
		DISPMSG( "[OnConnect] 辑滚 立加 己傍 (%s) \n", GetServerType2String(GetServerType()) );
	}
	else
	{
		m_bIsTriedToConnect = FALSE;
		TryToConnect();
	}
}

VOID ServerSession::OnAccept( DWORD dwNetworkIndex )
{
	_setConnected( TRUE );
	_setIsConnector( FALSE );
	SetSessionIndex( dwNetworkIndex );
	ServerSessionManager::Instance()->AddServer( this );
	DISPMSG( "[OnAccept]辑滚 立加 己傍(%s) \n", GetServerType2String(GetServerType()) );
}

VOID ServerSession::OnDisconnect()
{
	_setConnected( FALSE );
	ServerSessionManager::Instance()->RemoveServer( GetSessionIndex() );
	if( _isConnector() )
	{
		m_bIsTriedToConnect = FALSE;
		TryToConnect();
	}
	DISPMSG( "[OnDisconnect]辑滚 楷搬 秦力 (%s) \n", GetServerType2String(GetServerType()) );
	
}

VOID ServerSession::SendServerType()
{
	MSG_SERVER_TYPE		msg;
	msg.m_byCategory	= 0;
	msg.m_byProtocol	= 0;
#ifdef _USING_ACCOUNT_DBPROXY_SERVER
	msg.m_byServerType	= ACCOUNT_DBPROXY;
#else
	msg.m_byServerType	= GAME_DBPROXY;
#endif

	Send( (BYTE*)&msg, sizeof(MSG_SERVER_TYPE) );
}

VOID ServerSession::SetAddr( char *pszIP, WORD wPort )
{
	m_strConnectIP = pszIP;
	m_wConnectPort = wPort;
}

VOID ServerSession::TryToConnect()
{
	if( m_strConnectIP.empty() )
	{
		DISPMSG( "[TryToConnect] can't try to connect because address is empty.\n" );
		return;
	}

	if( m_bIsTriedToConnect )
		return;

	m_bIsTriedToConnect = TRUE;

	g_DBProxyServer.ConnectToServer( this, (char*)m_strConnectIP.c_str(), m_wConnectPort );
}

BOOL ServerSession::SendPacket( MSG_BASE * pMsg, WORD wSize )
{
	return NetworkObject::Send( (BYTE*)pMsg, wSize );
}

VOID CallBackMessage( char * szMessage )
{
	SUNLOG( eCRITICAL_LOG, "[DBMessage]:%s", szMessage );
}

VOID CallBackQueryResult( DWORD dwIndex, QueryResult * pData )
{
	BYTE byPacketCategory	= (BYTE)LOWORD( dwIndex );
	BYTE byPacketType		= (BYTE)HIWORD( dwIndex );
	((ServerSession *)pData->GetVoidObject())->DBResult( byPacketCategory, byPacketType, pData );	
}

⌨️ 快捷键说明

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