// BillingTestModule.cpp : ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ Å¬·¡½º µ¿ÀÛÀ» Á¤ÀÇÇÕ´Ï´Ù. // #include "stdafx.h" #include "BillingTestModule.h" #include "BillingTestModuleDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif #include #include // 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((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); } }