📄 mapserversocket.cpp
字号:
////////////////////////////////////////////////////////////////////////////////////////
// MapServerSocket.cpp : implementation file
//
//
//
//
//
////////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resource.h"
#include "MapServerSocket.h"
#include "DBSocket.h"
#include "CUdpSocket.h"
#include "CFightzone.h"
#include "PacketCrypt.h"
#include "CGuild.h"
#include "ServerMem.h"
#include "CLog.h"
#include "RegCrypt.h"
#ifdef DEF_AZIT
#include "AzitManager.h"
#endif
#include <mstcpip.h>
#ifdef DEF_SECURITYPACKET
#include "17CryptServer.h"
#include "Crypt.h" // Crypt Function
CRegCrypt crypt;
#endif
#include <WinVer.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma comment(compiler)
#ifdef DEF_SIMULATION
static NPC * lpSampleNPC;
#endif
HANDLE g_hIOCP;
_LPCFIGHTZONEMANAGER g_lpFightzoneManager = NULL ;
ONTRANSFUNC OnTransFunc[DEF_MAXMAPACKET] ;
extern void UserLog(_LPSOCKET_FD p, const char *pszParam, ...); //Jason 2004-07-22
////////////////////////////////////////////////////////////////////////////////////////
// Global 函荐
////////////////////////////////////////////////////////////////////////////////////////
extern WORD MAPSERVER_VERSION;
extern HWND g_MainHwnd;
extern HINSTANCE g_hInstance;
extern _LPDBSOCK g_lpDBSock ;
extern _LPUDPSOCKET g_lpUdpSock;
extern ServerMem *g_pServerMem;
extern _LPCLOGMANAGER g_lpLog ;
CDBConnection g_AccountDB; // AccountD Database Connect
Map *g_pMap; // MAP 包府 (User捞悼)
BaseData g_Base; // Data Base 包访
SafeList *g_AIMsgList[MAX_MAPLAYER]; // AI贸府侩 Msg (NPC 侩)
////////////////////////////////////////////////////////////////////////////////////////
// Socket Validity
//
////////////////////////////////////////////////////////////////////////////////////////
bool IsSocketValidity( _LPSOCKET_FD pSocketFD )
{
if(!pSocketFD ) return false;
if( pSocketFD->dwMagicNum != MAGIC_NUM )
{
ErrorMsg("(X) IsSocketValidity :Socket Magic Num Error");
return false;
}
if( pSocketFD->bClose ) return false;
if( pSocketFD->socket == INVALID_SOCKET ) return false;
return true;
}
////////////////////////////////////////////////////////////////////////////////////////
// Socket Validity
//
////////////////////////////////////////////////////////////////////////////////////////
bool IsPlayerConnect( _LPSOCKET_FD pSocketFD )
{
if(!pSocketFD ) return false;
if( pSocketFD->dwMagicNum != MAGIC_NUM )
{
ErrorMsg("(X) IsSocketValidity :Socket Magic Num Error");
return false;
}
if( pSocketFD->bClose ) return false;
if( pSocketFD->socket == INVALID_SOCKET ) return false;
if( pSocketFD->PlayerStatus != CONNECT_START ) return false;
return true;
}
////////////////////////////////////////////////////////////////////////////////////////
// Connect 包访 累诀 thread
////////////////////////////////////////////////////////////////////////////////////////
unsigned __stdcall Thread_Accept(LPVOID lpVoid)
{
MapServerSocket* pMapServerSocket = (MapServerSocket*)lpVoid;
if( pMapServerSocket )
{
pMapServerSocket->WorkAccept();
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
// IOCP 包访 累诀 thread
////////////////////////////////////////////////////////////////////////////////////////
unsigned __stdcall Thread_Iocp(LPVOID lpVoid)
{
MapServerSocket* pMapServerSocket = (MapServerSocket*)lpVoid;
if( pMapServerSocket )
{
pMapServerSocket->WorkIocp();
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
// IO 肯丰等饶 贸府窍绰 Thread
////////////////////////////////////////////////////////////////////////////////////////
unsigned __stdcall Thread_IOReadCompleted(LPVOID lpVoid)
{
MapServerSocket* pMapServerSocket = (MapServerSocket*)lpVoid;
if( pMapServerSocket )
{
pMapServerSocket->WorkReadCompleted();
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
// Item包府 Thread
////////////////////////////////////////////////////////////////////////////////////////
unsigned __stdcall Thread_WorkTick(LPVOID lpVoid)
{
MapServerSocket* pMapServerSocket = (MapServerSocket*)lpVoid;
if( pMapServerSocket )
{
pMapServerSocket->WorkTick();
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////////////////////////
MapServerSocket::MapServerSocket()
{
m_bPKMode = FALSE; // NON-PK Mode
m_pSendIOPool = NULL; // IO
m_pRecvIOPool = NULL; // IO
m_hIOCP = NULL; // IOCP handle
for( DWORD i=0 ; i < MAX_WORKER_THREAD ; i++ ) // IOCP Work Thread Handle
{
m_hIOCPThreads[i] = NULL;
}
m_dwThreadCount = 0; // 角 iocp work thread 肮荐
// Read IO Completed
m_hReadEventCompleted = NULL; // IO 肯丰登菌澜阑 舅覆
m_listReadCompleted.RemoveAll();
m_SocketListen = INVALID_SOCKET; // Listen Socket
#if defined(DEF_SPEEDHACK) || defined(DEF_KORSPEEDHACK)
m_listHackingConnection.RemoveAll();
#endif
}
////////////////////////////////////////////////////////////////////////////////////////
// MapServerSocket 秦力
//
// - Delete Map NPC
// - Delete Item
////////////////////////////////////////////////////////////////////////////////////////
MapServerSocket::~MapServerSocket()
{
#ifdef DEF_AZITSIMULATION
// 辑滚 辆丰矫 技陛阑 历厘茄促.
Batch_AzitTaxSave() ;
#endif
// --------------------------------------------------------------------------------
// Close IOCP Handle
// --------------------------------------------------------------------------------
if( g_hIOCP )
{
for( DWORD i = 0; i < m_dwThreadCount; i++)
{
PostQueuedCompletionStatus(g_hIOCP, 0, 0, NULL);
}
}
CLOSEHANDLE(g_hIOCP); // IOCP handle
SetEvent(m_hReadEventCompleted);
CLOSEEVENT(m_hReadEventCompleted);
CLOSESOCKET(m_SocketListen); // Listen Socket 秦力
// --------------------------------------------------------------------------------
// 秦寸 Memory俊辑 秦力 矫糯
//
// - 荤侩磊 Memory甫 眠饶 昏力 矫糯
// --------------------------------------------------------------------------------
if( m_listConnection.GetCount() > 0 )
{
POSITION pos = m_listConnection.GetHeadPosition();
while( pos )
{
_LPSOCKET_FD pTempSocket = (_LPSOCKET_FD)m_listConnection.GetNext(pos);
// Memory啊 蜡瓤茄 版快
if( !IsBadReadPtr( pTempSocket, sizeof(_SOCKET_FD) ) )
{
ReleaseSocketContext( pTempSocket );
}
}
}
if( m_listReadCompleted.GetCount() > 0 )
{
POSITION pos = m_listReadCompleted.GetHeadPosition();
while( pos )
{
_LPPER_IO_CONTEXT lpIOContext = (_LPPER_IO_CONTEXT)m_listReadCompleted.GetNext(pos);
ReleaseIOContext(lpIOContext);
}
}
m_listConnection.RemoveAll();
m_listReadCompleted.RemoveAll();
#if defined(DEF_SPEEDHACK) || defined(DEF_KORSPEEDHACK)
if( m_listHackingConnection.GetCount() > 0 )
{
POSITION pos = m_listHackingConnection.GetHeadPosition();
while( pos )
{
_LPSOCKET_FD pTempSocket = (_LPSOCKET_FD)m_listHackingConnection.GetNext(pos);
// Memory啊 蜡瓤茄 版快
if( !IsBadReadPtr( pTempSocket, sizeof(_SOCKET_FD) ) )
{
ReleaseSocketContext( pTempSocket );
}
}
}
m_listHackingConnection.RemoveAll();
#endif
// --------------------------------------------------------------------------------
// Memory Pool Delete
// --------------------------------------------------------------------------------
SAFE_DELETE< CMemPool<_PER_IO_CONTEXT> > (&m_pSendIOPool) ;
SAFE_DELETE< CMemPool<_PER_IO_CONTEXT> > (&m_pRecvIOPool) ;
#ifdef DEF_SECURITYPACKET
_17DeInit() ;
#endif
}
////////////////////////////////////////////////////////////////////////////////////////
// Initialize
//
// - Map Load
// - Event
// - Network
// - DataBase
// - Create Thread
////////////////////////////////////////////////////////////////////////////////////////
bool MapServerSocket::Initialize()
{
m_bPKMode = _Module.m_nPKMode; // PK Mode Setting
srand( (unsigned)time( NULL ) ); // Random 窃荐甫 檬扁拳 矫糯
//
// Map Initialize
//
if( !g_pMap->Initialize() ) return false;
//
// Event Initialize
//
if( !InitializeEvent() )
{
ErrorMsg("(X) Map Server : InitializeEvent" );
return false;
}
//
// Network Initialize
//
if( !InitializeNetwork( _Module.m_szMapIP, _Module.m_nMapPORT ) )
{
ErrorMsg("(X) Map Server : InitializeNetwork");
return false;
}
//
// Create Thread
//
if( !InitializeThread() )
{
ErrorMsg("(X) MapServer : InitializeThread");
return false;
}
//
// DB俊 SERVER 矫累阑 殿废
//
DB_ServerStart();
InitializeFP() ;
#ifdef DEF_KUMA_GAMBLE
m_Gamble.InitGambleLuck( TRUE );
#endif
ErrorMsg( "[Ver %d] Starting Map Server - %d port >>--", MAPSERVER_VERSION, _Module.m_nMapPORT );
return true;
}
////////////////////////////////////////////////////////////////////////////////////////
// Jason 2004-08-26-china
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::ShutdownServer()
{
// --------------------------------------------------------------------------------
// Close IOCP Handle
// --------------------------------------------------------------------------------
if( g_hIOCP )
{
for( DWORD i = 0; i < m_dwThreadCount; i++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -