Files
Sun1602/Server/AuthSystem/RTT/RTTService/RTTServer.cpp
T
2022-10-26 12:25:11 +08:00

144 lines
3.6 KiB
C++

#include "stdafx.h"
#include "Entry.h"
#include "RTTServer.h"
#include "PatchRTTA.h"
#include <eXtreme/util/WinService.h>
#define LIMITE_CONNECTTICK 3000
// Connection state
#define CS_CLOSED 0x0001
#define CS_TRYCONNECT 0x0002
#define CS_CONNECTED 0x0003
RTTServer::RTTServer()
: eXtreme::ServerSession( 2048, 2048 )
{
m_disconnTick = 0;
m_connectState = CS_CLOSED;
m_dwTicHeartBeat = 0;
}
RTTServer::~RTTServer()
{
}
void RTTServer::OnConnect( bool success, DWORD /*error*/ )
{
if( success == true )
{
GetHandle()->SetBufferSize( 65535, 65535 );
m_connectState = CS_CONNECTED;
m_dwTicHeartBeat = ::GetTickCount();
OutputDebug( "Connected to RTTServer.\n" );
}
else
{
m_connectState = CS_CLOSED;
m_disconnTick = ::GetTickCount();
}
}
void RTTServer::OnClose( DWORD error )
{
m_connectState = CS_CLOSED;
m_disconnTick = ::GetTickCount();
OutputDebug( "Connection closed with RTTServer(%d)\n", error );
}
void RTTServer::CheckDisconnected()
{
if( m_connectState != CS_CLOSED )
return;
// ¿¬°áÀ» Àç½Ãµµ ÇÑ´Ù.
if( ::GetTickCount() - m_disconnTick > LIMITE_CONNECTTICK )
{
Connect( Entry::Instance()->m_serverIPAddr, ( unsigned short )Entry::Instance()->m_serverPortNo );
m_connectState = CS_TRYCONNECT;
m_disconnTick = ::GetTickCount();
}
}
void RTTServer::Update()
{
CheckDisconnected();
if( m_connectState != CS_CONNECTED )
{
return;
}
if( ::GetTickCount() - m_dwTicHeartBeat > TIME_HEARTBEAT )
{
SendHeartBeat();
m_dwTicHeartBeat = ::GetTickCount();
}
eXtreme::ServerSession::Update();
}
void RTTServer::SendHeartBeat()
{
MSG_RTTR_HEARTBEAT_NTF sendPacket;
SendMessage( sendPacket );
}
void RTTServer::SendMessage( MSG_HEADER8& packet, int size )
{
if( size == 0 )
ServerSession::SendPacket( &packet, packet.dwSize + sizeof( MSG_HEADER8 ) );
else
ServerSession::SendPacket( &packet, size );
}
void RTTServer::OnReceive( char* buffer, int size )
{
MSG_HEADER8* header = ( MSG_HEADER8* )buffer;
switch( header->dwID )
{
case RTTR_RTTASTART_NTF: OnRTTAStartNTF( buffer, size ); break;
case RTTR_RTTASTOP_NTF: OnRTTAStopNTF( buffer, size ); break;
case RTTR_RTTAPATCH_NTF: OnRTTAPatchNTF( buffer, size ); break;
}
}
void RTTServer::OnRTTAStartNTF( char* /*buffer*/, int /*size*/ )
{
DWORD dwResult = eXtreme::WinService::Instance()->StartService( 0, SERVICENAME_RTTA );
OutputDebug( "RTTA Service starting result = %d\n", dwResult );
}
void RTTServer::OnRTTAStopNTF( char* /*buffer*/, int /*size*/ )
{
DWORD dwResult = eXtreme::WinService::Instance()->StopService( 0, SERVICENAME_RTTA );
OutputDebug( "RTTA Service stopping result = %d\n", dwResult );
}
void RTTServer::OnRTTAPatchNTF( char* buffer, int /*size*/ )
{
MSG_RTTR_RTTAPATCH_NTF* recvPacket = ( MSG_RTTR_RTTAPATCH_NTF* )buffer;
char szFtpAddress[20] = {0, };
char szFtpUser[20] = {0, };
char szFtpPassword[20] = {0, };
char szFtpGetFilePath[40] = {0, };
char szFtpGetFileName[40] = {0, };
DWORD dwFtpPort = recvPacket->dwFtpPort;
::WideCharToMultiByte( CP_ACP, 0, recvPacket->szFtpAddress , -1, szFtpAddress , 20, 0, 0 );
::WideCharToMultiByte( CP_ACP, 0, recvPacket->szFtpUser , -1, szFtpUser , 20, 0, 0 );
::WideCharToMultiByte( CP_ACP, 0, recvPacket->szFtpPassword , -1, szFtpPassword , 20, 0, 0 );
::WideCharToMultiByte( CP_ACP, 0, recvPacket->szFtpGetFilePath , -1, szFtpGetFilePath , 40, 0, 0 );
::WideCharToMultiByte( CP_ACP, 0, recvPacket->szFtpGetFileName , -1, szFtpGetFileName , 40, 0, 0 );
PatchRTTA::Instance()->Start( szFtpAddress, dwFtpPort, szFtpUser, szFtpPassword, szFtpGetFilePath, szFtpGetFileName );
}