2024-12-21 10:04:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "StdAfx.h"
|
|
|
|
|
|
#include "NetPacketParser.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
#include <map>
|
|
|
|
|
|
|
|
|
|
|
|
#define DNPRJSAFE // DNPrjSafe.h <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
#include "CriticalSection.h"
|
|
|
|
|
|
#include "DNPacket.h"
|
|
|
|
|
|
#include "DNServerDef.h"
|
|
|
|
|
|
#include "DNServerPacket.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "SysBaseBase.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CNetPacketParser::CNetPacketParser()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_lpfnPacketNotifyProc = NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CNetPacketParser::~CNetPacketParser()
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
BOOL CNetPacketParser::PacketParse(class CSessionBase* lpSession, CHAR* lpcBuffer, INT& iBufferPtr, UINT uIoBytes, UINT uTotalBufferSize, LPVOID lpRecvNotifyProcParam, IN_ADDR /*stIpAddress*/, WORD /*wPortNumber*/)
|
|
|
|
|
|
{
|
|
|
|
|
|
CNetPacketParser* lpThis = reinterpret_cast<CNetPacketParser*>(lpRecvNotifyProcParam);
|
|
|
|
|
|
|
|
|
|
|
|
if (uIoBytes < sizeof(DNTPacketHeader))
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>Ŷ<EFBFBD><C5B6> <20>⺻ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
UINT aParseProcessSize = 0;
|
|
|
|
|
|
|
|
|
|
|
|
WHILE_INFINITE
|
|
|
|
|
|
{
|
|
|
|
|
|
SHORT aMainCmd = reinterpret_cast<DNTPacketHeader*>(lpcBuffer + iBufferPtr)->cMainCmd;
|
|
|
|
|
|
SHORT aSubCmd = reinterpret_cast<DNTPacketHeader*>(lpcBuffer + iBufferPtr)->cSubCmd;
|
|
|
|
|
|
SHORT aPacketLen = reinterpret_cast<DNTPacketHeader*>(lpcBuffer + iBufferPtr)->iLen;
|
|
|
|
|
|
|
|
|
|
|
|
if (static_cast<UINT>(aPacketLen) > uTotalBufferSize)
|
|
|
|
|
|
{
|
|
|
|
|
|
iBufferPtr = uIoBytes;
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (static_cast<UINT>(aPacketLen) <= uIoBytes - iBufferPtr)
|
|
|
|
|
|
{
|
|
|
|
|
|
// Ư<><C6AF> <20><>Ŷ<EFBFBD><C5B6> <20><> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (lpThis->GetNotifyProc())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (NOERROR != lpThis->GetNotifyProc()(lpSession, aMainCmd, aSubCmd,
|
|
|
|
|
|
reinterpret_cast<LPBYTE>((aPacketLen > sizeof(DNTPacketHeader))?(lpcBuffer + iBufferPtr + sizeof(DNTPacketHeader)):(NULL)),
|
|
|
|
|
|
aPacketLen))
|
|
|
|
|
|
{
|
|
|
|
|
|
iBufferPtr = uIoBytes;
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
iBufferPtr += aPacketLen;
|
|
|
|
|
|
aParseProcessSize += aPacketLen;
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (aParseProcessSize >= uIoBytes)
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><>Ŷ<EFBFBD><C5B6> <20><> ó<><C3B3><EFBFBD>ߴ<EFBFBD>.
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|