📄 worldserver.cpp
字号:
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*)¬iceMsg, 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 + -