www.pudn.com > 221315556.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\\" ); 
		} 
		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; 
}