Files
mir_server/server/GateServer/GateServer.cpp
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

293 lines
8.4 KiB
C++

#include "StdAfx.h"
#include "DataProcess.h"
#include "SockProcess.h"
#include "SelectSockProcess.h"
#include "IOCPSockProcess.h"
#include "GateServer.h"
#include "GateServerConfig.h"
const char szExceptionDumpFile[] = ".\\RunGate.dmp";
#ifdef _USRDLL
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
static LPTOP_LEVEL_EXCEPTION_FILTER lpOldExceptonFilter;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
lpOldExceptonFilter = SetUnhandledExceptionFilter( DefaultUnHandleExceptionFilter );
InitDefMsgOut();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UninitDefMsgOut();
SetUnhandledExceptionFilter( lpOldExceptonFilter );
break;
}
return TRUE;
}
#endif
/*************************作为插件的导出函数*************************/
CRunSockProcesser* EXPORTCALL CreateRunGate(RUNSOCKTYPE SockType, int MaxSession)
{
CRunSockProcesser *pRunSock;
CRunDataProcesser *pRunData;
if ( SockType == rsSelect )
pRunSock = new CSelectRunSockProcesser();
#ifdef WIN32
else if ( SockType == rsIOCP )
pRunSock = new CIOCPRunSockProcesser();
#endif
else return NULL;
pRunData = new CRunDataProcesser( MaxSession );
pRunSock->SetDataProcesser( pRunData );
return pRunSock;
}
VOID EXPORTCALL FreeRunGate(CRunSockProcesser *pRunSock)
{
if ( pRunSock )
{
pRunSock->Stop();
pRunSock->GetDataProcesser()->Stop();
delete pRunSock->GetDataProcesser();
delete pRunSock;
}
}
VOID EXPORTCALL RunGateSetBindAddress(CRunSockProcesser *pRunSock, LPCSTR sBindAddress)
{
pRunSock->SetBindAddress( sBindAddress );
}
VOID EXPORTCALL RunGateSetBindPort(CRunSockProcesser *pRunSock, INT nBindPort)
{
pRunSock->SetBindPort( nBindPort );
}
INT EXPORTCALL RunGateGetIOWorkThreadCount(CRunSockProcesser *pRunSock)
{
#ifdef WIN32
if ( pRunSock->GetRunSockType() == rsIOCP )
return ((CIOCPRunSockProcesser*)pRunSock)->GetWorkThreadCount();
else
#endif
return -1;
}
BOOL EXPORTCALL RunGateSetIOWorkThreadCount(CRunSockProcesser *pRunSock, INT nThreadCount)
{
#ifdef WIN32
if (pRunSock->GetRunSockType() == rsIOCP)
{
((CIOCPRunSockProcesser*)pRunSock)->SetWorkThreadCount(nThreadCount);
return TRUE;
}
#endif
return FALSE;
}
BOOL EXPORTCALL RunGateStartup(CRunSockProcesser *pRunSock)
{
CRunDataProcesser *pRunData = pRunSock->GetDataProcesser();
if ( pRunData->Startup() )
{
if ( pRunSock->InitBase() )
{
if ( pRunSock->Start() )
return TRUE;
else pRunSock->UninitBase();
}
pRunData->Stop();
}
return FALSE;
}
VOID EXPORTCALL RunGateStop(CRunSockProcesser *pRunSock)
{
pRunSock->Stop();
pRunSock->UninitBase();
pRunSock->GetDataProcesser()->Stop();
}
INT EXPORTCALL RunGateGetActiveSessionCount(CRunSockProcesser *pRunSock)
{
return pRunSock->GetDataProcesser()->GetActiveUserCount();
}
VOID EXPORTCALL RunGateSetName(CRunSockProcesser *pRunSock, LPCSTR sName)
{
pRunSock->GetDataProcesser()->SetName( sName );
}
VOID EXPORTCALL RunGateSetServerIP(CRunSockProcesser *pRunSock, LPCSTR sServerName)
{
pRunSock->GetDataProcesser()->SetServerHost( sServerName );
}
VOID EXPORTCALL RunGateSetServerPort(CRunSockProcesser *pRunSock, int port)
{
pRunSock->GetDataProcesser()->SetServerPort( port );
}
INT EXPORTCALL RunGateGetSendThreadCount(CRunSockProcesser *pRunSock)
{
return pRunSock->GetDataProcesser()->GetSendThreadCount();
}
VOID EXPORTCALL RunGateSetSendThreadCount(CRunSockProcesser *pRunSock, INT nThreadCount)
{
pRunSock->GetDataProcesser()->SetSendThreadCount( nThreadCount );
}
DATAPROCESSERTYPE RunGateGetDataProcessType(CRunSockProcesser *pRunSock)
{
return pRunSock->GetDataProcesser()->GetDataProcessType();
}
VOID EXPORTCALL RunGateSetDataProcessType(CRunSockProcesser *pRunSock, DATAPROCESSERTYPE ProcessType)
{
pRunSock->GetDataProcesser()->SetDataProcessType( ProcessType );
}
VOID EXPORTCALL RunGateSetDataProcessPrintMsgPacket(CRunSockProcesser *pRunSock, BOOL boPrintC2S, BOOL boPrintS2C)
{
pRunSock->GetDataProcesser()->SetPrintC2SMessage(boPrintC2S);
pRunSock->GetDataProcesser()->SetPrintS2CMessage(boPrintS2C);
}
BOOL EXPORTCALL RunGateQuerySendThreadInfo(CRunSockProcesser *pRunSock, INT nThreadIdx, PRUNGATESENDTHREADQUERYSTRUCT pQueryStruct)
{
PRUNDATASENDTHREAD pSendThread;
pSendThread = pRunSock->GetDataProcesser()->GetSendThreadInfo( nThreadIdx );
if ( pSendThread )
{
pQueryStruct->hThread = pSendThread->hThread;
pQueryStruct->dwThreadId = pSendThread->dwThreadId;
pQueryStruct->dwProcTick = pSendThread->dwProcTick;
pQueryStruct->dwSleepTick = pSendThread->dwSleepTick;
return TRUE;
}
return FALSE;
}
INT EXPORTCALL RunGateEnumActiveSessions(CRunSockProcesser *pRunSock, RUNGATE_ENUMSESSION_ROUTINE lpCallBack)
{
int nCount = 0;
TICKCOUNT dwCurTick;
PRUNGATEUSERSESSION pSession, pLastSession;
RUNGATEQUERYSESSIONSTRUCT SessionInfo;
dwCurTick = _getTickCount();
pSession = pRunSock->GetDataProcesser()->GetFirstSession();
pLastSession = pSession + pRunSock->GetDataProcesser()->GetMaxSessionCount();
while ( pSession < pLastSession )
{
if ( pSession->nSocket != INVALID_SOCKET && !pSession->boMarkToClose && !pSession->boRemoteClosed )
{
SessionInfo.nSocket = pSession->nSocket;
SessionInfo.pSession = pSession;
SessionInfo.SockAddr = pSession->SockAddr;
SessionInfo.nRecvPacketCount = pSession->nRecvPacketCount;
SessionInfo.nSendPacketCount = pSession->nSendPacketCount;
SessionInfo.wPacketError= pSession->wPacketError;
SessionInfo.btPacketIdx = pSession->btPacketIdx;
SessionInfo.boSendAvaliable = pSession->boSendAvaliable;
SessionInfo.nVerifyIdx = pSession->nVerifyIdx;
SessionInfo.nRecvBufSize = pSession->RecvBuf.nOffset;
SessionInfo.nRecvCacheSize = pSession->RecvBuf.nSize;
SessionInfo.nSendBufSize = pSession->SendBuf.nOffset;
SessionInfo.nSendCacheSize = pSession->SendBuf.nSize;
SessionInfo.dwActiveTick = dwCurTick - pSession->dwConnectTick;
SessionInfo.dwClientMsgTick = dwCurTick - pSession->dwClientMsgTick;
SessionInfo.dwServerMsgTick = dwCurTick - pSession->dwServerMsgTick;
//memcpy( SessionInfo.sLoginAccount, pSession->sLoginAccount, __min(sizeof(SessionInfo.sLoginAccount), sizeof(pSession->sLoginAccount)) );
//memcpy( SessionInfo.sLoginCharName, pSession->sLoginCharName, __min(sizeof(SessionInfo.sLoginCharName), sizeof(pSession->sLoginCharName)) );
//SessionInfo.nSessionId = pSession->nSessionId;
if ( !lpCallBack( pRunSock, &SessionInfo ) )
break;
nCount++;
}
pSession++;
}
return nCount;
}
BOOL EXPORTCALL RunGateCloseSession(CRunSockProcesser *pRunSock, PRUNGATEUSERSESSION pSession)
{
PRUNGATEUSERSESSION pFirstSession;
if ( !pRunSock || !pSession )
return FALSE;
pFirstSession = pRunSock->GetDataProcesser()->GetFirstSession();
if ( pSession < pFirstSession )
return FALSE;
if ( pSession >= pFirstSession + pRunSock->GetDataProcesser()->GetMaxSessionCount() )
return FALSE;
if ( (((size_t)pSession) - ((size_t)pFirstSession)) % sizeof(*pSession) != 0 )
return FALSE;
if ( pSession->nSocket == INVALID_SOCKET || pSession->boMarkToClose || pSession->boRemoteClosed )
return FALSE;
pRunSock->GetDataProcesser()->SendCloseSession( pSession, TRUE, 9999 );
return TRUE;
}
VOID EXPORTCALL RunGateQueryDataStatics(CRunSockProcesser *pRunSock, PRUNDATASTATICS pQueryStruct)
{
CRunDataProcesser *pRunData = pRunSock->GetDataProcesser();
pQueryStruct->dwProcessRecvSize = pRunData->m_dwProcessRecvSize;
pQueryStruct->dwWaitSendUserSize = pRunData->m_dwWaitSendUserSize;
pQueryStruct->dwWaitSendQueueSize = pRunData->m_dwWaitSendQueueSize;
pQueryStruct->dwRecvSeverSize = pRunData->m_dwRecvSeverSize;
pQueryStruct->dwSendUserSize = pRunData->m_dwSendUserSize;
pQueryStruct->dwLastProcUsrMsgTime = pRunData->m_dwLastProcSrvMsgTime;
pQueryStruct->dwLastProcSrvMsgTime = pRunData->m_dwLastProcSrvMsgTime;
pQueryStruct->dwLastRecvSrvMsgTime = pRunData->m_dwLastRecvSrvMsgTime;
pQueryStruct->dwProcSrvThreadSleep = pRunData->m_dwProcSrvThreadSleep;
pQueryStruct->dwSendQueueSize = pRunData->m_dwSendQueueSize;
}
VOID EXPORTCALL RunGateResetDataStatics(CRunSockProcesser *pRunSock)
{
CRunDataProcesser *pRunData = pRunSock->GetDataProcesser();
InterlockedExchange( (LONG*)&pRunData->m_dwProcessRecvSize, 0 );
InterlockedExchange( (LONG*)&pRunData->m_dwRecvSeverSize, 0 );
InterlockedExchange( (LONG*)&pRunData->m_dwSendUserSize, 0 );
}
INT EXPORTCALL RunGateGetKernalVersion(LPVOID lpReseved)
{
return RUNGATE_KRN_VERSION;
}