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

📄 worldserver.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if( !m_pIOCPServer->StartListen( CLIENT_IOHANDLER, pDesc->szIP, pDesc->wPort ) )
		{
			MessageOut(eCRITICAL_LOG,   "Error! Client-side Listen failed!(%s:%d)", pDesc->szIP, pDesc->wPort );
			m_bShutdown = TRUE;
		}
		else
		{
			MessageOut(eCRITICAL_LOG,   "Client-side listen started...(%s:%d)", pDesc->szIP, pDesc->wPort );
		}
	}

	if( !m_pIOCPServer->IsListening( SERVER_IOHANDLER ) )
	{
		INI_IOHANDLER_DESC *pDesc = WorldServerInfoParser::Instance()->GetServerIoDesc();

		if( !m_pIOCPServer->StartListen( SERVER_IOHANDLER, pDesc->szIP, pDesc->wPort ) )
		{
			MessageOut(eCRITICAL_LOG,   "Error! Server-side Listen failed!(%s:%d)", pDesc->szIP, pDesc->wPort );
			m_bShutdown = TRUE;
		}
		else
		{
			MessageOut(eCRITICAL_LOG,   "Server-side listen started...(%s:%d)", pDesc->szIP, pDesc->wPort );
		}
	}
}

VOID WorldServer::StartListen( char *szIP, WORD wPort, char *szInnerIP, WORD wInnerPort )
{
	if( !m_pIOCPServer->IsListening( CLIENT_IOHANDLER ) )
	{
		if( !m_pIOCPServer->StartListen( CLIENT_IOHANDLER, szIP, wPort ) )
		{
			MessageOut(eCRITICAL_LOG,   "Error! Client-side Listen failed!(%s:%d)", szIP, wPort );
			m_bShutdown = TRUE;
		}
		else
		{
			MessageOut(eCRITICAL_LOG,   "Client-side listen started...(%s:%d)", szIP, wPort );
		}
	}

	if( !m_pIOCPServer->IsListening( SERVER_IOHANDLER ) )
	{
		if( !m_pIOCPServer->StartListen( SERVER_IOHANDLER, szInnerIP, wInnerPort ) )
		{
			MessageOut(eCRITICAL_LOG,   "Error! Server-side Listen failed!(%s:%d)", szInnerIP, wInnerPort );
			m_bShutdown = TRUE;
		}
		else
		{
			MessageOut(eCRITICAL_LOG,   "Server-side listen started...(%s:%d)", szInnerIP, wInnerPort );
		}
	}
}

VOID WorldServer::Run()
{
	if( WorldServerInfoParser::Instance()->IsServerInfoFromFile() )
	{
		ConnectToServer( m_pGameDBProxy, (char*)m_pGameDBProxy->GetConnectIP().c_str(), m_pGameDBProxy->GetConnectPort() );

		WorldServer::Instance()->StartListen();
	}
	else
	{
		// 付胶磐 辑滚俊 立加
		ConnectToServer( m_pMasterServer, (char*)m_pMasterServer->GetConnectIP().c_str(), m_pMasterServer->GetConnectPort() );
	}

	// 皋牢 风橇
	while( !m_bShutdown )
	{
//		Sleep( 10 );

		if( !Update() ) break;
	}
}

BOOL WorldServer::Update()
{
	// I/O 浚柳 诀单捞飘
	m_pIOCPServer->Update();

	UpdateFPS();

	// 能贾 贸府
	if( !ProcessConsole() )
	{
		return FALSE;
	}

	// 辑滚 技记 诀单捞飘
	ServerSessionManager::Instance()->Update();

	WaitingUserList::Instance()->Update();

	ChannelManager::Instance()->Update();
	// 府目池飘 眉农
	if( m_ReconnectTimer.IsExpired() )
	{
		MaintainConnection();
	}

	return TRUE;
}

VOID WorldServer::MaintainConnection()
{
	// 岿靛 辑滚啊 辆丰吝捞搁 府畔
	if( m_bShutdown )						return;

	if( !m_pGameDBProxy->IsConnected() )
	{
		ConnectToServer( m_pGameDBProxy, (char*)m_pGameDBProxy->GetConnectIP().c_str(), m_pGameDBProxy->GetConnectPort() );
	}

	// 付胶磐 辑滚客 楷搬捞 谗绢廉 乐栏搁 促矫 立加阑 矫档茄促.
	if( WorldServerInfoParser::Instance()->IsServerInfoFromFile() == FALSE )
	{
		if( !m_pMasterServer->IsConnected() )
		{
			ConnectToServer( m_pMasterServer, (char*)m_pMasterServer->GetConnectIP().c_str(), m_pMasterServer->GetConnectPort() );
		}
	}
	else
	{
		if( !m_pGameDBProxy->IsConnected() && !m_pGameDBProxy->GetConnectIP().empty() )
		{
			ConnectToServer( m_pGameDBProxy, (char*)m_pGameDBProxy->GetConnectIP().c_str(), m_pGameDBProxy->GetConnectPort() );
		}
	}
}

BOOL WorldServer::ProcessConsole()
{
	if( kbhit() )
	{
		char ch = getch();
		ch = toupper(ch);

		switch(ch)
		{
		case 0x1b:
			return FALSE;

		case ' ':
			DisplayServerInfo();
			break;

		case 'C':
			ChannelManager::Instance()->DisplayChannelInfo();
			break;

		case 'N':
			ReadAndSendNotice();
			break;
		}
	}

	return TRUE;
}

VOID WorldServer::ReadAndSendNotice()
{
	char szNotice[MAX_NOTICE_LEN+1];
	ZeroMemory( szNotice, sizeof(szNotice) );

	// 颇老俊辑 傍瘤 佬扁
	FILE *fp = fopen( "Notice.txt", "rt" );
	if( !fp )
	{
		MessageOut(eCRITICAL_LOG,   "Notice.txt 颇老阑 凯 荐 绝嚼聪促." );
		return;
	}
	fread( szNotice, sizeof(char), MAX_NOTICE_LEN, fp );
	fclose( fp );

	MSG_CW_NOTICE_BRD noticeMsg;
	noticeMsg.m_byCategory	= CW_CHAT;
	noticeMsg.m_byProtocol	= CW_NOTICE_BRD;
	noticeMsg.wLen			= (WORD)strlen(szNotice);
	strncpy( noticeMsg.szMsg, szNotice, noticeMsg.wLen ); 

	// 傈眉 傍瘤
	UserManager::Instance()->SendToAll( (BYTE*)&noticeMsg, noticeMsg.GetSize() );

	MessageOut(eCRITICAL_LOG,   ">> 岿靛傈眉傍瘤(颇老): %s", szNotice );
}	

VOID WorldServer::ConnectToServer( NetworkObject *pNetworkObject, char *pszIP, WORD wPort )
{
	m_pIOCPServer->Connect( SERVER_IOHANDLER, pNetworkObject, pszIP, wPort );
}

VOID WorldServer::SetGameDBProxyServerAddr( TCHAR* tszDBProxyIP, WORD wDBProxyPort )
{
	m_pGameDBProxy->SetAddr( tszDBProxyIP, wDBProxyPort );
}

VOID WorldServer::ConnectToGameDBProxyServer()
{
	ConnectToServer( m_pGameDBProxy, const_cast<char*>(m_pGameDBProxy->GetConnectIP().c_str()), m_pGameDBProxy->GetConnectPort() );
}

VOID WorldServer::ConnectToDBProxyServer()
{
	//MessageOut(eCRITICAL_LOG,   "Trying to connect to DB proxy server..." );
	//m_pAccountDBProxySession->TryToConnect();	
}

VOID WorldServer::UpdateFPS()
{
	// FPS Check
	static int cnt = 0;
	static DWORD prevTick = GetTickCount();

	cnt++;

	DWORD curTick = GetTickCount();

	if( prevTick + 1000 < curTick )
	{
		m_dwFPS = cnt;
		//MessageOut(eCRITICAL_LOG,   "%d FPS", cnt );
		prevTick	= curTick;
		cnt			= 0;

		if( m_dwFPS < 10 )
		{
			DISPMSG( "============================================================\n" );
			DISPMSG( "============================================================\n" );
			DISPMSG( "[WorldServer::UpdateFPS] FPS Warning!!! [%d] \n", m_dwFPS );
			DISPMSG( "============================================================\n" );
			DISPMSG( "============================================================\n" );
		}
	}
}

VOID WorldServer::DisplayServerInfo()
{
	DISPMSG( "======== World Server ========\n" );
	DISPMSG( " Frame per Second: %d\n", m_dwFPS );
	DISPMSG( " Client Connection: %d  GuidList(((  %d  )))  CharNameList(%d)\n",
			m_pIOCPServer->GetNumberOfConnections( CLIENT_IOHANDLER ),
			UserManager::Instance()->GetNumberOfGuidUsers(),
			UserManager::Instance()->GetNumberOfCharNameUsers()	);
	DISPMSG( " Server Connection: %d\n", m_pIOCPServer->GetNumberOfConnections( SERVER_IOHANDLER ) );
	DISPMSG( ">> C: 盲澄沥焊  N: 颇老傍瘤\n" );
	if( !WorldServerInfoParser::Instance()->IsServerInfoFromFile() )
	{
		if( !m_pMasterServer->IsConnected() )
		{
			DISPMSG( ">> Warning: Not connected to master server.\n" );
		}
	}
	if( !m_pGameDBProxy->IsConnected() )
	{
		DISPMSG( ">> Warning: Not connected to GameDBProxy server.\n" );
	}
}

BOOL WorldServer::IsConnectedTo( eSERVER_TYPE eServerType )
{
	switch( eServerType )
	{
	case MASTER_SERVER:
		return m_pMasterServer->IsConnected();
	case GAME_DBPROXY:
		return m_pGameDBProxy->IsConnected();
	}

	assert( !"弊繁 辑滚 鸥涝篮 绝绢夸" );

	return FALSE;	
}

⌨️ 快捷键说明

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