Files
Client/Server/Billing/한게임 통합빌링 테스트모듈/BillingTestModule.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

243 lines
7.2 KiB
C++

// BillingTestModule.cpp : 응용 프로그램에 대한 클래스 동작을 정의합니다.
//
#include "stdafx.h"
#include "BillingTestModule.h"
#include "BillingTestModuleDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include <mmsystem.h>
#include <algorithm>
// CBillingTestModuleApp
BEGIN_MESSAGE_MAP(CBillingTestModuleApp, CWinApp)
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
CBillingTestModuleApp::Packet::Packet(CBillingAsyncSocket& billingAsyncSocket,
const HanUnitedBilling::GLTransStruct glTransStruct,
unsigned long dwDelayMSec)
: m_billingAsyncSocket(billingAsyncSocket),
m_glTransStruct(glTransStruct),
m_dwPendingTime(timeGetTime()),
m_dwDelayMSec(dwDelayMSec)
{
}
// CBillingTestModuleApp 생성
CBillingTestModuleApp::CBillingTestModuleApp()
: m_lpBillingTestModule(0), m_lpListenAsyncSocket(0)
{
// TODO: 여기에 생성 코드를 추가합니다.
// InitInstance에 모든 중요한 초기화 작업을 배치합니다.
}
// 유일한 CBillingTestModuleApp 개체입니다.
CBillingTestModuleApp theApp;
// CBillingTestModuleApp 초기화
BOOL CBillingTestModuleApp::InitInstance()
{
// 응용 프로그램 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
// 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControls()가 필요합니다.
// InitCommonControls()를 사용하지 않으면 창을 만들 수 없습니다.
InitCommonControls();
CWinApp::InitInstance();
if(!AfxSocketInit())
{
AfxMessageBox("소켓 초기화 실패!");
return FALSE;
}
m_lpListenAsyncSocket = CBillingAsyncSocket::CreateBillingSocket(SOCK_STREAM, LISTEN_PORT);
if(0 == m_lpListenAsyncSocket
|| !m_lpListenAsyncSocket->Listen())
{
AfxMessageBox("소켓 리슨 실패!");
return FALSE;
}
AfxEnableControlContainer();
// 표준 초기화
// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
// 아래에서 필요 없는 특정 초기화 루틴을 제거해야 합니다.
// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
// 적절한 내용으로 수정해야 합니다.
SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성한 응용 프로그램"));
CBillingTestModuleDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 여기에 대화 상자가 확인을 눌러 없어지는 경우 처리할
// 코드를 배치합니다.
}
else if (nResponse == IDCANCEL)
{
// TODO: 여기에 대화 상자가 취소를 눌러 없어지는 경우 처리할
// 코드를 배치합니다.
}
m_lpListenAsyncSocket->Close();
m_lpListenAsyncSocket->Release();
m_lpListenAsyncSocket = 0;
// 대화 상자가 닫혔으므로 응용 프로그램의 메시지 펌프를 시작하지 않고
// 응용 프로그램을 끝낼 수 있도록 FALSE를 반환합니다.
return FALSE;
}
void CBillingTestModuleApp::ProcessPacket()
{
const int MAX_PROCESS_COUNT = 100;
int nProcessCount = 0;
CBillingTestModuleDlg* lpDlg = GetMainDlg();
if(0 != lpDlg)
{
unsigned long dwCurrentTime = timeGetTime();
while(!m_RecvPacketList.empty() && nProcessCount < MAX_PROCESS_COUNT)
{
Packet& packet = m_RecvPacketList.front();
// 시간이 충분히 지난 후 패킷을 처리.
if(0 < static_cast<long>((packet.m_dwDelayMSec + packet.m_dwPendingTime) - dwCurrentTime))
{
break;
}
// 로그인, 로그아웃을 처리한다.
packet.m_glTransStruct.HeaderMsg = ntohs(packet.m_glTransStruct.HeaderMsg);
packet.m_glTransStruct.DataSize = ntohs(packet.m_glTransStruct.DataSize);
packet.m_glTransStruct.SeqID = ntohl(packet.m_glTransStruct.SeqID);
const char* szIP = packet.m_glTransStruct.Data;
const char* szID = packet.m_glTransStruct.Data + HanUnitedBilling::MAX_IP_LEN;
switch(packet.m_glTransStruct.HeaderMsg)
{
case HanUnitedBilling::AUTH:
lpDlg->Login(packet.m_billingAsyncSocket, packet.m_glTransStruct.SeqID, szID, szIP);
break;
case HanUnitedBilling::LOGOUT:
lpDlg->Logout(packet.m_billingAsyncSocket, packet.m_glTransStruct.SeqID, szID, szIP);
break;
case HanUnitedBilling::BILL_AUTH:
lpDlg->BillAuth(packet.m_billingAsyncSocket, packet.m_glTransStruct.SeqID, szID, szIP);
break;
}
packet.m_billingAsyncSocket.Release();
m_RecvPacketList.pop_front();
}
}
}
void CBillingTestModuleApp::AddRecvPacket(CBillingAsyncSocket& billingAsyncSocket,
const char* szBuffer, unsigned short usDataLen)
{
CBillingTestModuleDlg* lpDlg = GetMainDlg();
HanUnitedBilling::GLTransStruct glTransStruct;
memset(&glTransStruct, 0, sizeof(HanUnitedBilling::GLTransStruct));
memcpy(&glTransStruct, szBuffer, min(usDataLen, sizeof(HanUnitedBilling::GLTransStruct)));
if(0 != lpDlg)
{
unsigned long dwDelayMSec = 0;
CBillingTestModuleDlg::Behavior behavior = CBillingTestModuleDlg::NORMAL_PROCESS;
switch(ntohs(glTransStruct.HeaderMsg))
{
case HanUnitedBilling::AUTH:
{
behavior = lpDlg->GetLoginAckType();
if(CBillingTestModuleDlg::DELAY_ALL_PROCESS == behavior)
{
dwDelayMSec = lpDlg->GetLoginAckDelay();
}
}
break;
case HanUnitedBilling::BILL_AUTH:
{
behavior = lpDlg->GetBillAuthAckType();
if(CBillingTestModuleDlg::DELAY_ALL_PROCESS == behavior)
{
dwDelayMSec = lpDlg->GetBillAuthAckDelay();
}
}
break;
}
if(CBillingTestModuleDlg::DROP_ALL_PROCESS != behavior)
{
billingAsyncSocket.AddRef();
m_RecvPacketList.push_back(Packet(
billingAsyncSocket, glTransStruct, dwDelayMSec));
}
else
{
lpDlg->AddLog(NORMAL_LOG, "SS:0x%p/UID_IP:%s/Cmd:%d/SeqID:%d/패킷을 Drop합니다.",
&billingAsyncSocket, billingAsyncSocket.GetPeerAddrString(),
ntohs(glTransStruct.HeaderMsg), ntohl(glTransStruct.SeqID));
}
}
}
void CBillingTestModuleApp::RegisterSocket(CBillingAsyncSocket& billingAsyncSocket)
{
if(m_SocketList.end() == std::find(m_SocketList.begin(), m_SocketList.end(), &billingAsyncSocket))
{
m_SocketList.push_back(&billingAsyncSocket);
}
}
void CBillingTestModuleApp::RemoveSocket(CBillingAsyncSocket& billingAsyncSocket)
{
SocketList::iterator pos = std::find(m_SocketList.begin(), m_SocketList.end(), &billingAsyncSocket);
if(pos != m_SocketList.end())
{
m_SocketList.erase(pos);
}
}
void CBillingTestModuleApp::SendPendingAll(const HanUnitedBilling::GLTransStruct& glTransStruct)
{
SocketList::iterator pos = m_SocketList.begin();
SocketList::iterator end = m_SocketList.end();
for(; pos != end; ++pos)
{
(*pos)->SendPending(glTransStruct);
}
}