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>
This commit is contained in:
@@ -0,0 +1,443 @@
|
||||
#include "stdafx.h"
|
||||
#include "ClientEventHandler.h"
|
||||
|
||||
#include <Network/Packet/PacketBase.h>
|
||||
#include <Network/Packet/PacketCommand.h>
|
||||
#include <Network/Packet/PacketStruct/ServerPacket.h>
|
||||
#include <Network/XORCrypt/XORCrypt.h>
|
||||
#include <Network/ClientNetwork/Session.h>
|
||||
#include <Utility/Compress/MiniLZO/miniLZOWrapper.h>
|
||||
#include <Thread/ThreadMgr.h>
|
||||
|
||||
#include <mmsystem.h>
|
||||
#include "GMMemory.h"
|
||||
|
||||
namespace ClientNet
|
||||
{
|
||||
|
||||
CClientEventHandler::CClientEventHandler()
|
||||
: m_lpEventHandlerMgr(0),
|
||||
m_dwHandlerID(0), m_dwSessionID(0),
|
||||
m_bCloseCalled(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CClientEventHandler::~CClientEventHandler()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool CClientEventHandler::SendPacket(CNetworkMsgBlock* lpMsgBlock)
|
||||
{
|
||||
return (0 != m_lpEventHandlerMgr) ?
|
||||
m_lpEventHandlerMgr->SendPacket(this, lpMsgBlock) : false;
|
||||
}
|
||||
|
||||
CClientEventHandlerMgr::CClientEventHandlerMgr()
|
||||
: m_dwMaxEventHandlerID(0), m_bExit(FALSE)
|
||||
{
|
||||
m_SessionMgr.SetDispatchQueue(m_LockedMsgQueue);
|
||||
|
||||
CThreadMgr::Run(this);
|
||||
}
|
||||
|
||||
CClientEventHandlerMgr::~CClientEventHandlerMgr()
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Handler<65><72> <20><><EFBFBD>ؼ<EFBFBD>, Close<73><65> ȣ<><C8A3><EFBFBD>Ѵ<EFBFBD>.
|
||||
ClientEventHanderMap::iterator pos = m_ClientEventHandlerMap.begin();
|
||||
ClientEventHanderMap::iterator end = m_ClientEventHandlerMap.end();
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
Close(pos->second);
|
||||
}
|
||||
|
||||
// 2<>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>⸦ <20><><EFBFBD>ٸ<EFBFBD><D9B8><EFBFBD>.
|
||||
DWORD dwLastTime = timeGetTime();
|
||||
|
||||
do
|
||||
{
|
||||
HandleEvents(0xFFFFFFFF);
|
||||
Sleep(100);
|
||||
}
|
||||
while(timeGetTime() - dwLastTime < 5000 && !m_ClientEventHandlerMap.empty());
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
End();
|
||||
CThreadMgr::Stop(this, 2000);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
pos = m_ClientEventHandlerMap.begin();
|
||||
end = m_ClientEventHandlerMap.end();
|
||||
|
||||
for(; pos != end; ++pos)
|
||||
{
|
||||
delete pos->second;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void CClientEventHandlerMgr::HandleEvents(unsigned long dwProcessPerCall)
|
||||
{
|
||||
m_LockedMsgQueue.GetMessages(m_LocalMsgQueue, ULONG_MAX);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
|
||||
|
||||
CNetworkMsgBlock* lpMsgBlock = 0;
|
||||
|
||||
ClientEventHanderMap::iterator pos;
|
||||
ClientEventHanderMap::iterator end = m_ClientEventHandlerMap.end();
|
||||
|
||||
for (DWORD dwCount = 0; dwCount < dwProcessPerCall; ++dwCount)
|
||||
{
|
||||
lpMsgBlock = m_LocalMsgQueue.Dequeue();
|
||||
|
||||
if(0 == lpMsgBlock)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
pos = m_ClientEventHandlerMap.find(lpMsgBlock->GetID());
|
||||
|
||||
if(pos != end)
|
||||
{
|
||||
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Handler<65><72> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD>.
|
||||
CClientEventHandler* lpHandler = pos->second;
|
||||
|
||||
switch(lpMsgBlock->GetMsgType())
|
||||
{
|
||||
case NET_MSG_ACK_DISPATCH:
|
||||
|
||||
if (-1 == lpHandler->OnDispatch(
|
||||
reinterpret_cast<PktBase*>(lpMsgBlock->rd_ptr()), lpMsgBlock->GetAddress()))
|
||||
{
|
||||
Close(lpHandler);
|
||||
}
|
||||
break;
|
||||
|
||||
case NET_MSG_ACK_OPEN:
|
||||
|
||||
{
|
||||
// <20>ɵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> Handler<65><72> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
int nErrorCode = 0;
|
||||
DWORD dwSessionID = 0;
|
||||
|
||||
lpMsgBlock->pop(nErrorCode);
|
||||
lpMsgBlock->pop(dwSessionID);
|
||||
|
||||
lpHandler->SetSessionID(dwSessionID);
|
||||
if(-1 == lpHandler->OnOpen(nErrorCode))
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20>ݱ⸦ ȣ<><C8A3><EFBFBD>Ѵ<EFBFBD>.
|
||||
if(0 == nErrorCode)
|
||||
{
|
||||
Close(lpHandler);
|
||||
}
|
||||
}
|
||||
|
||||
if (0 != nErrorCode)
|
||||
{
|
||||
lpHandler->OnClose();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case NET_MSG_ACK_CLOSE:
|
||||
|
||||
lpHandler->OnClose();
|
||||
|
||||
// <20>ڵ鷯<DAB5><E9B7AF> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
|
||||
delete lpHandler;
|
||||
|
||||
m_ClientEventHandlerMap.erase(pos);
|
||||
end = m_ClientEventHandlerMap.end();
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO : Accept<70><74> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>, Handler<65><72> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> <20>̰<EFBFBD><CCB0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ְ<EFBFBD>,
|
||||
// <20><EFBFBD><DEBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.(CThreadEventHandler<65><72> EventID<49><44> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ֵ<EFBFBD><D6B5><EFBFBD>..)
|
||||
|
||||
|
||||
}
|
||||
|
||||
lpMsgBlock->SetMsgType(NET_MSG_FREE);
|
||||
CNetworkMsgPool::GetInstance().FreeNetworkMsgBlock(lpMsgBlock);
|
||||
}
|
||||
}
|
||||
|
||||
bool CClientEventHandlerMgr::Connect(INET_Addr& connAddr, CClientEventHandler* lpEventHandler)
|
||||
{
|
||||
if (0 == lpEventHandler)
|
||||
{
|
||||
fprintf(stderr, "CClientEventHandlerMgr::Connect - EventHandler is NULL\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
CNetworkMsgBlock* lpMsgBlock =
|
||||
CNetworkMsgPool::GetInstance().GetNetworkMsgBlock(1, connAddr);
|
||||
|
||||
if(0 == lpMsgBlock || !lpMsgBlock->is_valid())
|
||||
{
|
||||
fprintf(stderr, "CClientEventHandlerMgr::Connect - NetMsgBlock Create Failed\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
DWORD dwHandlerID = 0;
|
||||
|
||||
ClientEventHanderMap::iterator pos;
|
||||
ClientEventHanderMap::iterator end = m_ClientEventHandlerMap.end();
|
||||
|
||||
do
|
||||
{
|
||||
// <20><> <20><><EFBFBD><EFBFBD>ID<49><44> ã<>´<EFBFBD>.
|
||||
dwHandlerID = ++m_dwMaxEventHandlerID;
|
||||
pos = m_ClientEventHandlerMap.find(dwHandlerID);
|
||||
}
|
||||
while(pos != end);
|
||||
|
||||
m_ClientEventHandlerMap.insert(
|
||||
ClientEventHanderMap::value_type(dwHandlerID, lpEventHandler));
|
||||
|
||||
lpEventHandler->SetHandlerID(dwHandlerID);
|
||||
lpEventHandler->SetPeerAddress(connAddr);
|
||||
lpEventHandler->SetEventHandlerMgr(this);
|
||||
|
||||
lpMsgBlock->SetAddress(connAddr);
|
||||
lpMsgBlock->SetMsgType(NET_MSG_REQ_TCP_OPEN);
|
||||
lpMsgBlock->SetID(dwHandlerID);
|
||||
m_SessionMgr.PutMessage(lpMsgBlock);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CClientEventHandlerMgr::Close(CClientEventHandler* lpEventHandler)
|
||||
{
|
||||
CNetworkMsgBlock* lpMsgBlock =
|
||||
CNetworkMsgPool::GetInstance().GetNetworkMsgBlock(1, INET_Addr());
|
||||
|
||||
if(0 == lpMsgBlock || !lpMsgBlock->is_valid())
|
||||
{
|
||||
fprintf(stderr, "CClientEventHandlerMgr::Close - NetMsgBlock Create Failed\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
lpEventHandler->SetCloseCalled();
|
||||
|
||||
lpMsgBlock->SetMsgType(NET_MSG_REQ_CLOSE);
|
||||
lpMsgBlock->SetID(lpEventHandler->GetSessionID());
|
||||
m_SessionMgr.PutMessage(lpMsgBlock);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CClientEventHandlerMgr::SendPacket(CClientEventHandler* lpEventHandler, CNetworkMsgBlock* lpMsgBlock)
|
||||
{
|
||||
if (0 != lpEventHandler && 0 != lpMsgBlock)
|
||||
{
|
||||
lpMsgBlock->SetMsgType(NET_MSG_REQ_SEND);
|
||||
lpMsgBlock->SetID(lpEventHandler->GetSessionID());
|
||||
|
||||
m_SessionMgr.PutMessage(lpMsgBlock);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
unsigned int CClientEventHandlerMgr::Run()
|
||||
{
|
||||
while(!InterlockedCompareExchange(&m_bExit, TRUE, TRUE))
|
||||
{
|
||||
m_SessionMgr.HandleEvents(1000);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
BOOL CClientEventHandlerMgr::End()
|
||||
{
|
||||
InterlockedExchange(&m_bExit, TRUE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
CThreadEventHandler::CThreadEventHandler(CLockedMsgQueue& LockedMsgQueue, DWORD dwClientHandlerID)
|
||||
: m_LockedMsgQueue(LockedMsgQueue),
|
||||
m_Crypt(CXORCrypt::GetInstance()),
|
||||
m_dwClientHandlerID(dwClientHandlerID),
|
||||
CEventHandler(60) // 1<>и<EFBFBD><D0B8><EFBFBD> ȣ<><C8A3><EFBFBD>Ѵ<EFBFBD>.
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// <20><>Ŷ<EFBFBD><C5B6> <20><EFBFBD><DEBE><EFBFBD> <20><> <20>Ҹ<EFBFBD><D2B8><EFBFBD>. <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><DEBD><EFBFBD> ť<><C5A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
int CThreadEventHandler::OnReceived(CNetworkMsgBlock& msg_block)
|
||||
{
|
||||
const int MAX_PACKET_PER_RECV = 32;
|
||||
|
||||
char* rd_ptr = 0;
|
||||
PktBase* lpPktBase = 0;
|
||||
DWORD length = static_cast<unsigned long>(msg_block.length());
|
||||
DWORD decompress_len = 0;
|
||||
|
||||
CNetworkMsgBlock* lpNewMsgBlock = 0;
|
||||
CNetworkMsgPool& netMessagePool = CNetworkMsgPool::GetInstance();
|
||||
|
||||
CNetworkMsgQueue netMsgQueue;
|
||||
|
||||
while(sizeof(PktBase) <= length)
|
||||
{
|
||||
rd_ptr = msg_block.rd_ptr();
|
||||
lpPktBase = reinterpret_cast<PktBase*>(rd_ptr);
|
||||
|
||||
// <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> vaild<6C><64><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>. invalid<69><64> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>׳<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if(StartBit != lpPktBase->GetStartBit())
|
||||
{
|
||||
fprintf(stderr, "CClientEventHandler::OnReceived - Packet header is invalid. Not equal startbit\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// <20><>Ŷ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڵ<EFBFBD>
|
||||
m_Crypt.DecodeHeader(rd_ptr + 1, sizeof(PktBase) - 1, 0, 0);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
const PktBase::CMDType nPacketCMD = lpPktBase->GetCmd();
|
||||
const PktBase::LengthType nPacketLength = lpPktBase->GetLen();
|
||||
|
||||
if(length < nPacketLength)
|
||||
{
|
||||
// <20><>ü <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD> <20>Ľ<EFBFBD><C4BD><EFBFBD> <20>ϱ<CFB1><E2BFA1> <20><><EFBFBD>ڶ<EFBFBD>. <20>ٽ<EFBFBD> <20><><EFBFBD>ڵ<EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD>
|
||||
m_Crypt.EncodeHeader(rd_ptr + 1, sizeof(PktBase) - 1, 0, 0);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><>Ŷ <20><><EFBFBD>ڵ<EFBFBD>.
|
||||
if(lpPktBase->IsCrypt())
|
||||
{
|
||||
m_Crypt.DecodePacket(rd_ptr + sizeof(PktBase),
|
||||
nPacketLength - sizeof(PktBase), lpPktBase->GetCodePage());
|
||||
}
|
||||
|
||||
// <20><>Ŷ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
if(lpPktBase->IsCompress())
|
||||
{
|
||||
decompress_len = PktMaxLen - sizeof(PktBase);
|
||||
|
||||
lpNewMsgBlock = netMessagePool.GetNetworkMsgBlock(PktMaxLen, msg_block.GetAddress());
|
||||
if(0 == lpNewMsgBlock)
|
||||
{
|
||||
fprintf(stderr, "CClientEventHandler::OnReceived - Create NetworkMsgBlock Failed for Decompress\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
char* szDecompressedPacket = lpNewMsgBlock->wr_ptr();
|
||||
memcpy(szDecompressedPacket, lpPktBase, sizeof(PktBase));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ۿ<EFBFBD><DBBF><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
||||
if(!CMiniLZO::Decompress(rd_ptr + sizeof(PktBase), nPacketLength - sizeof(PktBase),
|
||||
szDecompressedPacket + sizeof(PktBase), &decompress_len))
|
||||
{
|
||||
netMessagePool.FreeNetworkMsgBlock(lpNewMsgBlock);
|
||||
fprintf(stderr, "CClientEventHandler::OnReceived - Decompress Packet Failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
lpNewMsgBlock->wr_ptr(decompress_len + sizeof(PktBase));
|
||||
lpPktBase = reinterpret_cast<PktBase*>(lpNewMsgBlock->rd_ptr());
|
||||
|
||||
lpPktBase->SetLen(static_cast<PktBase::LengthType>(decompress_len + sizeof(PktBase)));
|
||||
}
|
||||
else
|
||||
{
|
||||
lpNewMsgBlock = netMessagePool.GetNetworkMsgBlock(nPacketLength, msg_block.GetAddress());
|
||||
if(0 == lpNewMsgBlock)
|
||||
{
|
||||
fprintf(stderr, "CClientEventHandler::OnReceived - Create NetworkMsgBlock Failed for Enqueue\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
memcpy(lpNewMsgBlock->wr_ptr(), rd_ptr, nPacketLength);
|
||||
lpNewMsgBlock->wr_ptr(nPacketLength);
|
||||
}
|
||||
|
||||
lpNewMsgBlock->SetMsgType(NET_MSG_ACK_DISPATCH);
|
||||
lpNewMsgBlock->SetID(m_dwClientHandlerID);
|
||||
netMsgQueue.Enqueue(lpNewMsgBlock);
|
||||
|
||||
length -= nPacketLength;
|
||||
msg_block.rd_ptr(nPacketLength);
|
||||
}
|
||||
}
|
||||
|
||||
m_LockedMsgQueue.PutMessages(netMsgQueue);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CThreadEventHandler::OnOpen(CSession& ConnSession, int iErrorCode)
|
||||
{
|
||||
CNetworkMsgBlock* lpNewMsgBlock =
|
||||
CNetworkMsgPool::GetInstance().GetNetworkMsgBlock(
|
||||
sizeof(int) + sizeof(unsigned long), INET_Addr());
|
||||
|
||||
if(0 == lpNewMsgBlock)
|
||||
{
|
||||
fprintf(stderr, "CThreadEventHandler::OnOpen - NetMsgBlock Create Failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
lpNewMsgBlock->SetMsgType(NET_MSG_ACK_OPEN);
|
||||
lpNewMsgBlock->SetID(m_dwClientHandlerID);
|
||||
lpNewMsgBlock->push(iErrorCode);
|
||||
lpNewMsgBlock->push(ConnSession.GetSessionID());
|
||||
|
||||
m_LockedMsgQueue.PutMessage(lpNewMsgBlock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CThreadEventHandler::OnClose(CSession& CloseSession)
|
||||
{
|
||||
CNetworkMsgBlock* lpNewMsgBlock =
|
||||
CNetworkMsgPool::GetInstance().GetNetworkMsgBlock(1, INET_Addr());
|
||||
|
||||
if(0 == lpNewMsgBlock)
|
||||
{
|
||||
fprintf(stderr, "CThreadEventHandler::OnClose - NetMsgBlock Create Failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
lpNewMsgBlock->SetMsgType(NET_MSG_ACK_CLOSE);
|
||||
lpNewMsgBlock->SetID(m_dwClientHandlerID);
|
||||
m_LockedMsgQueue.PutMessage(lpNewMsgBlock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int CThreadEventHandler::OnTimeout(CSession& Session)
|
||||
{
|
||||
// Ping<6E><67> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
ClientNet::CNetworkMsgBlock* lpMsgBlock =
|
||||
CNetworkMsgPool::GetInstance().GetNetworkMsgBlock(sizeof(PktSyP), INET_Addr());
|
||||
|
||||
if(0 != lpMsgBlock)
|
||||
{
|
||||
PktSyP* lpSyPAckPt = reinterpret_cast<PktSyP*>(lpMsgBlock->wr_ptr());
|
||||
lpSyPAckPt->m_dwTickTime = timeGetTime();
|
||||
|
||||
if (lpMsgBlock->WrapCrypt(sizeof(PktSyP), CmdSysPing, 0))
|
||||
{
|
||||
Session.SendPending(lpMsgBlock);
|
||||
}
|
||||
else
|
||||
{
|
||||
CNetworkMsgPool::GetInstance().FreeNetworkMsgBlock(lpMsgBlock);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user