您的位置:首页 > 运维架构 > 网站架构

奇迹世界服务器架构(2)

2009-01-01 15:21 204 查看
b、代码实现连接 连接每个服务器都用继承自ServerSession 的类实现 有如下类 AgentServerSession BattleServerSession FieldServerSession GameDBProxySession GuildServerSession MasterServerSession 基类ServerSession 有 update 实现心跳连接 VOID ServerSession::Update()
{
if( IsForConnect() )
{
// heartbeat 焊郴扁
DWORD dwCurTick = GetTickCount();
if( dwCurTick - m_dwLastHeartbeatTick > 10000 )
{
m_dwLastHeartbeatTick = dwCurTick; MSG_HEARTBEAT msg;
msg.m_byCategory = 0;
msg.m_byProtocol = SERVERCOMMON_HEARTBEAT;
Send( (BYTE*)&msg, sizeof(MSG_HEARTBEAT) );
}
}
} 每个Session要连接服务器的时候 VOID GameDBProxySession::OnConnect( BOOL bSuccess, DWORD dwSessionIndex )
{
ServerSession::OnConnect( bSuccess, dwSessionIndex ); if( bSuccess )
{
ServerSession::SendServerType(); g_pGameServer->ConnectTo( AGENT_SERVER );
}
else
{
//SUNLOG( eFULL_LOG, "Can't connect to game DB proxy." );
}
} VOID GameServer::ConnectTo( eSERVER_TYPE eServerType )
{
switch( eServerType )
{
case MASTER_SERVER:
ConnectToServer( m_pMasterServerSession,
(char*)m_pMasterServerSession->GetConnectIP().c_str(), m_pMasterServerSession->GetConnectPort() );
break; case GAME_DBPROXY:
ConnectToServer( m_pGameDBProxySession,
(char*)m_pGameDBProxySession->GetConnectIP().c_str(), m_pGameDBProxySession->GetConnectPort() );
break; case AGENT_SERVER:
ConnectToServer( m_pAgentServerSession,
(char*)m_pAgentServerSession->GetConnectIP().c_str(), m_pAgentServerSession->GetConnectPort() );
break;
case GUILD_SERVER:
ConnectToServer( m_pGuildServerSession,
(char*)m_pGuildServerSession->GetConnectIP().c_str(), m_pGuildServerSession->GetConnectPort() );
break; default:
ASSERT( !"弊繁 辑滚 鸥涝篮 绝绢夸" );
}
} DWORD GameServer::ConnectToServer( NetworkObject * pNetworkObject, char * pszIP, WORD wPort )
{
return m_pIOCPServer->Connect( SERVER_IOHANDLER, pNetworkObject, pszIP, wPort );
} DWORD IOCPServer::Connect( DWORD dwIoHandlerKey, NetworkObject *pNetworkObject, char *pszIP, WORD wPort )
{
if( pNetworkObject == NULL ) return 0; IOHANDLER_MAP_ITER it = m_mapIoHandlers.find( dwIoHandlerKey ); assert( it != m_mapIoHandlers.end() ); return it->second->Connect( pNetworkObject, pszIP, wPort );
} c、代码实现监听 VOID GameServer::StartListen()
{
SERVER_ENV * pServerEnv = m_pFileParser->GetServerEnv(); if( !m_pIOCPServer->IsListening( SERVER_IOHANDLER ) )
{
DISPMSG( "[GameServer::StartListen] Starting listen(%s:%d)...\n", pServerEnv->ServerIoHandler.szIP, pServerEnv->ServerIoHandler.wPort );
if( !m_pIOCPServer->StartListen( SERVER_IOHANDLER, pServerEnv->ServerIoHandler.szIP, pServerEnv->ServerIoHandler.wPort ) )
{
DISP_FAIL;
return ;
}
DISP_OK;
}
} BOOL IOCPServer::StartListen( DWORD dwIoHandlerKey, char *pIP, WORD wPort )
{
IOHANDLER_MAP_ITER it = m_mapIoHandlers.find( dwIoHandlerKey ); assert( it != m_mapIoHandlers.end() ); return it->second->StartListen( pIP, wPort );
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: