Files
wnmj/Servers/全局定义/PacketAide.h
2026-02-13 14:34:15 +08:00

189 lines
4.2 KiB
C++

#ifndef PACKET_AIDE_HEAD_FILE
#define PACKET_AIDE_HEAD_FILE
#pragma once
#pragma pack(1)
//////////////////////////////////////////////////////////////////////////////////
//数据定义
#define DTP_NULL 0 //无效数据
//数据描述
struct tagDataDescribe
{
WORD wDataSize; //数据大小
WORD wDataDescribe; //数据描述
};
//////////////////////////////////////////////////////////////////////////////////
//发送辅助类
class CSendPacketHelper
{
//变量定义
protected:
WORD m_wDataSize; //数据大小
WORD m_wMaxBytes; //缓冲大小
LPBYTE m_pcbBuffer; //缓冲指针
//函数定义
public:
//构造函数
inline CSendPacketHelper(VOID * pcbBuffer, WORD wMaxBytes);
//功能函数
public:
//清理数据
inline VOID CleanData() { m_wDataSize=0; }
//获取大小
inline WORD GetDataSize() { return m_wDataSize; }
//获取缓冲
inline VOID * GetDataBuffer() { return m_pcbBuffer; }
//功能函数
public:
//插入字符
inline bool AddPacket(LPCSTR pszString, WORD wDataType);
//插入字符
inline bool AddPacket(LPCWSTR pszString, WORD wDataType);
//插入数据
inline bool AddPacket(VOID * pData, WORD wDataSize, WORD wDataType);
};
//////////////////////////////////////////////////////////////////////////////////
//接收辅助类
class CRecvPacketHelper
{
//变量定义
protected:
WORD m_wDataPos; //数据点
WORD m_wDataSize; //数据大小
LPBYTE m_pcbBuffer; //缓冲指针
//函数定义
public:
//构造函数
inline CRecvPacketHelper(LPCVOID pcbBuffer, WORD wDataSize);
//功能函数
public:
//获取数据
inline VOID * GetData(tagDataDescribe & DataDescribe);
};
//////////////////////////////////////////////////////////////////////////////////
//构造函数
CSendPacketHelper::CSendPacketHelper(VOID * pcbBuffer, WORD wMaxBytes)
{
//设置变量
m_wDataSize=0;
m_wMaxBytes=wMaxBytes;
m_pcbBuffer=(BYTE *)pcbBuffer;
return;
}
//插入字符
bool CSendPacketHelper::AddPacket(LPCSTR pszString, WORD wDataType)
{
//参数判断
ASSERT(pszString!=NULL);
if (pszString[0]==0) return true;
//插入数据
return AddPacket((VOID *)pszString,CountStringBufferA(pszString),wDataType);
}
//插入字符
bool CSendPacketHelper::AddPacket(LPCWSTR pszString, WORD wDataType)
{
//参数判断
ASSERT(pszString!=NULL);
if (pszString[0]==0) return true;
//插入数据
return AddPacket((VOID *)pszString,CountStringBufferW(pszString),wDataType);
}
//插入数据
bool CSendPacketHelper::AddPacket(VOID * pData, WORD wDataSize, WORD wDataType)
{
//效验数据
ASSERT(wDataType!=DTP_NULL);
ASSERT((wDataSize+sizeof(tagDataDescribe)+m_wDataSize)<=m_wMaxBytes);
if ((wDataSize+sizeof(tagDataDescribe)+m_wDataSize)>m_wMaxBytes) return false;
//插入数据
ASSERT(m_pcbBuffer!=NULL);
tagDataDescribe * pDataDescribe=(tagDataDescribe *)(m_pcbBuffer+m_wDataSize);
pDataDescribe->wDataSize=wDataSize;
pDataDescribe->wDataDescribe=wDataType;
//插入数据
if (wDataSize>0)
{
ASSERT(pData!=NULL);
CopyMemory(pDataDescribe+1,pData,wDataSize);
}
//设置数据
m_wDataSize+=sizeof(tagDataDescribe)+wDataSize;
return true;
}
//////////////////////////////////////////////////////////////////////////////////
//构造函数
CRecvPacketHelper::CRecvPacketHelper(LPCVOID pcbBuffer, WORD wDataSize)
{
//设置变量
m_wDataPos=0;
m_wDataSize=wDataSize;
m_pcbBuffer=(BYTE *)pcbBuffer;
return;
}
//获取数据
VOID * CRecvPacketHelper::GetData(tagDataDescribe & DataDescribe)
{
//效验数据
if (m_wDataPos>=m_wDataSize)
{
ASSERT(m_wDataPos==m_wDataSize);
DataDescribe.wDataSize=0;
DataDescribe.wDataDescribe=DTP_NULL;
return NULL;
}
//获取数据
ASSERT((m_wDataPos+sizeof(tagDataDescribe))<=m_wDataSize);
CopyMemory(&DataDescribe,m_pcbBuffer+m_wDataPos,sizeof(tagDataDescribe));
ASSERT((m_wDataPos+sizeof(tagDataDescribe)+DataDescribe.wDataSize)<=m_wDataSize);
//效验数据
if ((m_wDataPos+sizeof(tagDataDescribe)+DataDescribe.wDataSize)>m_wDataSize)
{
DataDescribe.wDataSize=0;
DataDescribe.wDataDescribe=DTP_NULL;
return NULL;
}
//设置数据
VOID * pData=NULL;
if (DataDescribe.wDataSize>0) pData=m_pcbBuffer+m_wDataPos+sizeof(tagDataDescribe);
m_wDataPos+=sizeof(tagDataDescribe)+DataDescribe.wDataSize;
return pData;
};
//////////////////////////////////////////////////////////////////////////////////
#pragma pack()
#endif