Files
Sun1602/ProgramCommon/PacketControl/PacketControl.cpp
T
2022-10-26 12:25:11 +08:00

176 lines
4.9 KiB
C++

#include "stdafx.h"
#include "PacketControl.h"
#include <zlib.h>
#include <SkillInfoParser.h> // reserve deletion, used by 'PacketControl_Skill.hxx'
#ifdef _SERVER
#define SUBSTRACT_SIZE (0)
#else
#define SUBSTRACT_SIZE (sizeof(DWORD))
#endif
//==================================================================================================
//
//==================================================================================================
//
struct MSG_BASE;
//////////////////////////////////////////////////////////////////////////
#include "CategoryLinkPair.h"
#include "PacketControl_Compress.h"
#include "PacketControl_Types.hxx"
namespace nsPacket
{
//==================================================================================================
//
BOOLEAN
Environment::Init()
{
static BOOLEAN sbInit = FALSE;
if(sbInit)
return TRUE;
sbInit = TRUE;
__zlib_register_malloc(&CompressUtil::memalloc_handler);
__zlib_register_free(&CompressUtil::memfree_handler);
return TRUE;
}
//==================================================================================================
// <PacketControl::Pack_Unpack>
PacketInfo
PacketControl::MakeStream(const BOOLEAN isPack, MSG_BASE* const pMsg, const WORD wSize)
{
static BOOLEAN sbInit = Environment::Init();
static BYTE s_pPackStream[PacketControl::SIZEofSTREAM];
static BYTE s_pUnPackStream[PacketControl::SIZEofSTREAM];
BYTE* const pIOStream = isPack ? s_pPackStream : s_pUnPackStream;
PacketInfo packetInfo = { pMsg, wSize };
const WORD protocol = MAKEWORD(pMsg->m_byCategory, pMsg->m_byProtocol);
switch(protocol)
{
//case blah~:
// break;
case MAKEWORD(CG_CRYPTOGRAPHY, CG_CRYPTOGRAPHY_KEY):
case MAKEWORD(CG_CRYPTOGRAPHY, CG_CRYPTOGRAPHY_CMD):
packetInfo.pMsg = pMsg;
packetInfo.Size = wSize;
break;
default:
{
packetInfo = CompressUtil::MakeStream(isPack, pIOStream, pMsg, wSize);
}
break;
}
return packetInfo;
};
//==================================================================================================
// <PacketControl::Pack>
// - 단일 패킷 Pack 방안, 정의된 패킷에 대해서 처리된 결과 network IO buffer size와 달라질 수 있다.
// - (In Server) GameServer, AgentServer의 ->C 계열 패킷들은 이것을 거치도록 한다.
// - (In Client) to GameServer 패킷들 모두 이것을 거치도록 한다.
PacketInfo
PacketControl::Pack(MSG_BASE* const pMsg, const WORD wSize)
{
return MakeStream(TRUE, pMsg, wSize);
};
//==================================================================================================
// <PacketControl::Pack>
// - 단일 패킷 Pack 방안, 정의된 패킷에 대해서 처리된 결과 network IO buffer size와 달라질 수 있다.
// - (In Server) from Client 계열 패킷들은 이것을 거치도록 한다.
// - (In Client) from GameServer 패킷들 모두 이것을 거치도록 한다.
PacketInfo
PacketControl::UnPack(MSG_BASE* const pMsg, const WORD wSize)
{
return MakeStream(FALSE, pMsg, wSize);
};
/*
//==================================================================================================
// <Sample for Client>
// - gameserver->client 인 경우에만...
VOID fn_Callback_Recv(DWORD dwIndex, BYTE * pData, DWORD dwSize)
{
// decode
if(g_pNetwork->m_ProtocolCryptograpyMgr[dwIndex].IsUseRecvCryptography())
{
static SPacketBuffer decodeBuffer;
CProtocolCryptographyMgr& rCRYPTMGR = g_pNetwork->m_ProtocolCryptograpyMgr[dwIndex];
if(rCRYPTMGR.DecodePacket(decodeBuffer, pData, (INT)dwSize))
{
if(CI_GAMESERVERIDX == idx)
{
PacketInfo packetInfo = PacketControl::UnPack(decodeBuffer.PACKET_PTR, (WORD)dwSize);
g_pNetwork->m_fn_Forward_Recv(dwIndex, packetInfo.pMsg);
}
else
{
g_pNetwork->m_fn_Forward_Recv(dwIndex, decodeBuffer.PACKET_PTR);
}
}
}
else
{
g_pNetwork->m_fn_Forward_Recv(dwIndex, pData);
}
}
// client->gameserver 인 경우에만...
BOOL GlobalFunc::SendPacket(eCONNECTION_INDEX idx, void * pBuf, int iLength)
{
// sample packet
// MSG_CG_TEST_PACKET packet;
// packet.field0 = xxx;
// packet.field1 = xxx;
// packet.field2 = xxx;
if(CI_GAMESERVERIDX == idx)
{
PacketInfo packetInfo = PacketControl::Pack(pMsg, wSize);
return g_pNetwork->Send(idx, (VOID*)packetInfo.pMsg, (INT)packetInfo.Size);
}
return g_pNetwork->Send(idx, pBuf, iLength);
}
//
// - (WAVERIX)(080404) 여러 종류의 패킷을 한꺼번에 압축할 수 있는 형태 지원
// - (예) ATTACK_BRD 이후 HP BRD가 연결되곤 한다. 이 경우 각각에 대한 PACK이 수행되는 것이 아니라
// - 하나의 패킷에 이 두가지가 큰 비율로 압축되고, 풀릴 때, 두 가지로 분리되는 형태를 들 수 있다.
// - 적어도 기존 패킷 핸들링 각각에 대해 변동이 없는 방향이 필요하다.
// - 이건 정책성 알고리즘 범주에 속한다.
//
// - 하지만 이것은 이번에 적용하지 않는다.
// - 현 시점 설득도 힘들고 또한 현 구조에서 말끔한 구조가 나오지 않을 듯.
// - 무엇보다 서버에 그런 매커니즘이 전무한 실정
//
VOID OnRecv(const MSG_BASE* pMsg, const WORD wSize)
{
switch(pMsg->m_byProtocol)
{
case CG_COMPOSE_STREAM:
{
// 재귀적인 처리를 위한 방안
}
break;
}
}
*/
};