⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g_cmdpacket.cpp

📁 PC网络游戏的编程
💻 CPP
字号:
/*
g_CmdPacket.cpp: implementation of the CG_CmdPacket class.
*/

#include "g_cmdpacket.h"

CG_CmdPacket::CG_CmdPacket()
{
	m_nMaxSize = 0;
	m_nLen = 0;
	m_nReadOffset  = 0;
	m_nWriteOffset = 0;
	m_pData = NULL;
	/* set buffer to default size */
	SetSize(DEFAULT_CMD_PACKET_SIZE);
}

CG_CmdPacket::~CG_CmdPacket()
{
	delete []m_pData;
}

bool CG_CmdPacket::SetSize(int len)
{
	if(len > MAX_CMD_PACKET_SIZE) return false;
	delete []m_pData;
	m_pData = NULL;
	m_pData = new char[len];
	m_nMaxSize = len;
	return m_pData?true:false;
}

/* try write data to packet */
bool CG_CmdPacket::WriteData(void *data, int len)
{
	if ((m_nLen + len) > m_nMaxSize) return false;
	memcpy(m_pData+m_nWriteOffset,data,len);
	m_nLen += len;
	m_nWriteOffset += len;
	return true;
}

bool CG_CmdPacket::WriteByte(char c)
{
	return WriteData(&c,BYTE_SIZE);
}

void CG_CmdPacket::BeginRead(char *p,int len)
{
	m_pReadData = p;
	m_nLen = len;
	m_nReadOffset = 0;
}

void CG_CmdPacket::BeginRead()
{
	m_pReadData = m_pData;
	m_nReadOffset = 0;
}

void CG_CmdPacket::BeginWrite()
{
	m_nLen = 0;
	m_nWriteOffset = 0;
}

bool CG_CmdPacket::WriteBinary(char *data, int len)
{
	if (WriteShort(len)==false) 
		return false;
	return WriteData(data,len);
}

bool CG_CmdPacket::ReadBinary(char **data, int *len)
{
	short dataLen;
	if (!ReadShort(&dataLen)) return false;
	if (dataLen <= 0) return false;
	if ((m_nReadOffset + dataLen) > m_nLen) return false;
	*data = m_pReadData + m_nReadOffset;
	*len = dataLen;
	m_nReadOffset += dataLen;
	return true;
}

bool CG_CmdPacket::WriteShort(short s)
{
	return WriteData(&s,SHORT_SIZE);
}

bool CG_CmdPacket::WriteLong(long l)
{
	return WriteData(&l,LONG_SIZE);
}

bool CG_CmdPacket::WriteFloat(float f)
{
	return WriteData(&f,FLOAT_SIZE);
}

bool CG_CmdPacket::ReadByte(char *c)
{
	return ReadData(c,BYTE_SIZE);
}

bool CG_CmdPacket::ReadShort(short *s)
{
	return ReadData(s,SHORT_SIZE);
}

bool CG_CmdPacket::ReadLong(long *l)
{
	return ReadData(l,LONG_SIZE);
}

bool CG_CmdPacket::ReadFloat(float *f)
{
	return ReadData(f,FLOAT_SIZE);
}

bool CG_CmdPacket::ReadString(char **str)
{
	short len;
	if (!ReadShort(&len)) return false;
	if (len <= 0) return false;
	if ((m_nReadOffset + len) > m_nLen) return false;
	/* set end avoid overflow */
	*(m_pReadData+m_nReadOffset+len-1) = '\0';
	*str = m_pReadData + m_nReadOffset;
	m_nReadOffset += len;
	return true;
}

bool CG_CmdPacket::WriteString(char *str)
{
	short len = strlen(str) + 1;
	if (!WriteShort(len)) return false;
	return WriteData(str,len);
}

bool CG_CmdPacket::ReadData(void *data, int len)
{
	if ((m_nReadOffset + len)>m_nLen) return false;
	
	memcpy(data,m_pReadData+m_nReadOffset,len);
	m_nReadOffset += len;
	return true;
}

bool CG_CmdPacket::CopyData(char *buf,int len)
{
	if(!SetSize(len)) return false;
	memcpy(m_pData,buf,len);
	m_nLen = len;
	return true;
}

bool CG_CmdPacket::CloneFrom(CG_CmdPacket *packet)
{
	return CopyData(packet->GetData(),packet->GetDataSize());
}

char *CG_CmdPacket::GetData()
{
	return m_pData;
}

int CG_CmdPacket::GetDataSize()
{
	return m_nLen;
}

int CG_CmdPacket::GetMaxSize()
{
	return m_nMaxSize;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -