www.pudn.com > MirServer.rar > MirServer.cpp
#include "StdAfx.h"
#include ".\mirserver.h"
#include ".\mircode.h"
#include "..\..\public\ini.h"
CMirServer *CMirServer::m_pTheServer = NULL;
CMirServer::CMirServer(void)
{
m_pTheServer = this;
CSocket::NetStartup();
m_dwParam = 0x02040200;
SetMirWorldMode();
}
CMirServer::~CMirServer(void)
{
CSocket::NetCleanup();
}
DWORD CMirServer::Proc(LPVOID lpParam)
{
fd_set fdset;
timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 50;
int ierr = 0,i = 0;
UINT Id;
int iSize;
CMirClient * pClient;
CONNECTION connAccept;
// CMirClient * pClient = NULL;
DWORD dwCurTime = 0;
m_Socket.Listen( m_Config.nLoginPort, 64, &m_connLogin);
m_Socket.SetNoBlock( &m_connLogin );
m_Socket.Listen( m_Config.nSelCharPort, 64, &m_connSelChar);
m_Socket.SetNoBlock( &m_connSelChar );
m_Socket.Listen( m_Config.nGamePort, 64, &m_connGame);
m_Socket.SetNoBlock( &m_connGame );
FD_ZERO( &fdset );
memset( m_Sockets, 0, sizeof( SOCKET) * 2000 );
while( ThreadActive())
{
FD_ZERO( &fdset );
FD_SET( m_connLogin.Socket, &fdset );
FD_SET( m_connSelChar.Socket, &fdset );
FD_SET( m_connGame.Socket, &fdset );
ierr = select( 0, &fdset, 0, 0, &tv);
if( ierr > 0 )
{
if( FD_ISSET( m_connLogin.Socket, &fdset ))
{
if(m_Socket.Accept(m_connLogin.Socket, &connAccept ) )
{
OnLoginConnection(&connAccept);
}
}
if( FD_ISSET( m_connSelChar.Socket, &fdset ))
{
if( m_Socket.Accept(m_connSelChar.Socket, &connAccept ) )
{
OnSelCharConnection(&connAccept);
}
}
if( FD_ISSET( m_connGame.Socket, &fdset ))
{
if( m_Socket.Accept(m_connGame.Socket, &connAccept ) )
{
OnGameConnection(&connAccept);
}
}
}
m_SocketEvent.UpdateRead();
ierr = m_SocketEvent.GetReadSocket(m_Sockets, 0 );
if( ierr > 0 )
{
for( i = 0;i < ierr;i ++ )
{
Id =(UINT) m_SocketHash.HGet((int)m_Sockets[i] );
pClient = m_Clients.Get(Id);
if( pClient != NULL )
{
iSize = recv( m_Sockets[i], m_szRecvbuffer, 4096, 0 );
if( iSize == 0 || iSize == -1 )
{
OnError(pClient);
}
else
{
pClient->OnData( m_szRecvbuffer, (UINT)iSize );
}
}
}
}
for( pClient = m_Clients.First(); pClient != NULL ;pClient = m_Clients.Next() )
{
dwCurTime = GetTickCount();
pClient->Update( dwCurTime );
}
}
return 0;
}
BOOL CMirServer::Run(void)
{
DWORD dwId;
INIHANDLE hIni;
CHAR szFilename[256];
int i = 0;
hIni = iniopen( "config.ini" );
if( hIni )
{
m_Config.nGamePort = inigetint( hIni, "设置", "游戏端口", 7200 );
m_Config.nSelCharPort = inigetint( hIni, "设置", "选人端口", 7000 );
m_Config.nLoginPort = inigetint( hIni, "设置", "登陆端口", 7000 );
if( !inigetstring(hIni, "设置", "地址", m_Config.sIpAddress))
{
strncpy( m_Config.sIpAddress, "127.0.0.1", 20 );
}
if( !inigetstring(hIni, "设置", "帐号信息", m_Config.sAccountPath))
{
strcpy( m_Config.sAccountPath, ".\\account\\" );
strcpy( m_Config.sAccountPath, ".\\GameInfo\\" );
}
i = strlen( m_Config.sAccountPath);
if( m_Config.sAccountPath[i-1] != '\\' )
{
m_Config.sAccountPath[i] = '\\';
m_Config.sAccountPath[i+1] = '\0';
}
if( !inigetstring(hIni, "设置", "角色信息", m_Config.sCharacterPath))
{
strcpy( m_Config.sCharacterPath, ".\\Character\\" );
}
i = strlen( m_Config.sCharacterPath);
if( m_Config.sCharacterPath[i-1] != '\\' )
{
m_Config.sCharacterPath[i] = '\\';
m_Config.sCharacterPath[i+1] = '\0';
}
iniclose(hIni);
}
sprintf( szFilename, "%sConfig.ini", m_Config.sAccountPath);
hIni = iniopen( szFilename );
if( hIni )
{
m_Config.nAccountId = inigetint(hIni, "define", "startindex", 100000 );
iniclose(hIni);
}
sprintf( szFilename, "%sConfig.ini", m_Config.sCharacterPath);
hIni = iniopen( szFilename );
if( hIni )
{
m_Config.nCharacterId = inigetint(hIni, "define", "startindex", 100000 );
iniclose(hIni);
}
if( Create( 128 * 1024, (LPVOID*)this, &dwId ) == NULL )
return FALSE;
return 1;
}
VOID CMirServer::OnLoginConnection(PCONNECTION pConnection)
{
OnConnection(pConnection, CT_LOGIN);
return VOID();
}
VOID CMirServer::OnSelCharConnection(PCONNECTION pConnection)
{
OnConnection(pConnection, CT_SELCHAR);
return VOID();
}
VOID CMirServer::OnGameConnection(PCONNECTION pConnection)
{
OnConnection(pConnection, CT_GAME);
return VOID();
}
VOID CMirServer::OnConnection(PCONNECTION pConnection, int iType )
{
CMirClient * pClient;
UINT nId = m_Clients.New(&pClient);
pClient->SetId(nId);
pClient->SetConnection(pConnection, iType);
m_Socket.SetNoBlock( pConnection );
if( !m_SocketHash.HAdd((int)pConnection->Socket, (int)nId ) )
{
printf( "无法加入SOCKET哈希表!!\n");
}
pClient->m_nEventId = m_SocketEvent.Add(pConnection->Socket, 0 );
return VOID();
}
VOID CMirServer::OnError(CMirClient * pClient)
{
int ierr = WSAGetLastError();
SOCKET s = pClient->GetConnection()->Socket;
printf( "%s:%d 断开连接!\n", pClient->GetConnection()->IpAddress, pClient->GetConnection()->Port );
m_SocketEvent.Del( s, pClient->m_nEventId );
m_SocketHash.HDel( (int)s );
m_Clients.Del( pClient->GetId() );
//printf( "发生 %d 错误!\n", ierr);
return VOID();
}
VOID CMirServer::OnMessage(PMIRMSG pMsg, CHAR* pszParam)
{
return VOID();
}
VOID CMirServer::End(void)
{
SafeTerminate( 1000 );
return VOID();
}
CMirServer* CMirServer::GetTheServer(void)
{
return m_pTheServer;
}
VOID CMirServer::Test(DWORD dwParam)
{
m_dwParam = dwParam;
CMirClient * pClient = m_Clients.First();
if( pClient != NULL )pClient->OnTest( dwParam );
return VOID();
}
VOID CMirServer::GetIpAddress(CHAR* pszIpAddress)
{
return VOID();
}
BOOL CMirServer::CreateAccount(CHAR* pszUsername, CHAR* pszPassword, DWORD &dwError )
{
FILE * fp;
CHAR szFilename[256];
sprintf( szFilename, "%s%s.inf",m_Config.sAccountPath, pszUsername );
fp = fopen( szFilename, "r" );
if( fp != 0 )
{
fclose(fp);
return FALSE;
}
//fclose( fp );
fp = fopen( szFilename, "w" );
fprintf( fp, "[account]\nID = %d\nNAME = %s\nPASS = %s\nFeedType = 0\nFeedCount = 0\n", m_Config.nAccountId, pszUsername, pszPassword );
fclose( fp );
m_Config.nAccountId ++;
WriteConfig( 0 );
return 1;
}
VOID CMirServer::WriteConfig(int n)
{
FILE* fp = NULL;
CHAR szFilename[256];
switch( n)
{
case 0:
{
sprintf( szFilename, "%sConfig.ini", m_Config.sAccountPath);
fp = fopen( szFilename , "w" );
if( fp == NULL )return;
fprintf( fp , "[define]\nStartIndex = %d\n", m_Config.nAccountId );
fclose( fp );
}
break;
case 1:
{
sprintf( szFilename, "%sConfig.ini", m_Config.sCharacterPath);
fp = fopen( szFilename , "w" );
if( fp == NULL )return;
fprintf( fp , "[define]\nStartIndex = %d\n", m_Config.nCharacterId );
fclose( fp );
}
break;
case 2:
break;
}
return VOID();
}
BOOL CMirServer::LoadCharacter(CHAR* pszAccount, SELCHARLIST* pCharlist)
{
return 0;
}
BOOL CMirServer::SaveCharacter(CHAR* pszAccount, SELCHARLIST* pCharlist)
{
return 0;
}