?? lpackage.cpp
字號:
// LPackage.cpp: implementation of the CLPackage class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "LPackage.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//#include <Winsock2.h>
//##ModelId=3E795F870360
CLPackage::CLPackage()
{
lLenWordPos =4;//設置報文中放長度的long的位置
lPackHeadLen =12; //報文全長=PACK_HEAD_LEN + 報文中標記長度
InitPack();
}
//##ModelId=3E795F87036A
CLPackage::~CLPackage()
{
}
//##ModelId=3E795F87034F
void CLPackage::InitPack()
{
memset(m_szBuf,0,PACK_BUF_SIZE);//緩沖區
m_lBufLen=0;
}
//##ModelId=3E795F87034C
long CLPackage::SetBuffer(char *szBuf, long lBufLength)
{
if((lBufLength>PACK_BUF_SIZE)||(szBuf==NULL))
return false;
m_lBufLen=lBufLength;
memcpy(m_szBuf,szBuf,lBufLength);
return true;
}
//##ModelId=3E795F87037E
long CLPackage::GetVar(char *szPointer, long lLength)
{
if((lLength>PACK_BUF_SIZE)||(lLength>m_lBufLen))
return false;
if(szPointer!=NULL)
memcpy(szPointer,m_szBuf,lLength);
memcpy(m_szBuf,m_szBuf+lLength,m_lBufLen-lLength);
m_lBufLen-=lLength;
return true;
}
//##ModelId=3E795F870339
unsigned long CLPackage::GetDword()
{
unsigned long dTemp=0;
GetVar((char*)&dTemp,sizeof(unsigned long));
return htonl_my(dTemp);
}
//##ModelId=3E795F870338
unsigned short CLPackage::GetWord()
{
unsigned short wTemp=0;
GetVar((char*)&wTemp,sizeof(unsigned short));
return htons_my(wTemp);
}
//##ModelId=3E795F87032F
int CLPackage::GetInt()
{
int iTemp=0;
GetVar((char*)&iTemp,sizeof(int));
return htonl_my(iTemp);
}
//##ModelId=3E795F87032E
unsigned char CLPackage::GetByte()
{
unsigned char Temp=0;
GetVar((char*)&Temp,sizeof(unsigned char));
return Temp;
}
//##ModelId=3E795F87031B
long CLPackage::GetStrByLen(char *szOut, long lLen)
{
if(szOut!=NULL)
szOut[lLen]=0;
return GetVar(szOut,lLen);
}
//##ModelId=3E795F870309
long CLPackage::GetString(char *szOut,long lBufLen)
{
bool bOK=false;
int i=0;
for(i=0;i<=m_lBufLen;i++)
{
if(m_szBuf[i]==0)
{
bOK=true;
break;
}
}
if((!bOK)||(i>=lBufLen))
return false;
szOut[i]=0;
return GetVar(szOut,i+1);
}
//##ModelId=3E795F87036C
long CLPackage::PutVar(char *szData, long lLength)
{
if(((lLength+m_lBufLen)>PACK_BUF_SIZE)||(szData==NULL))
{
InitPack();
return false;
}
memcpy(m_szBuf+m_lBufLen,szData,lLength);
m_lBufLen+=lLength;
return true;
}
//##ModelId=3E795F870307
long CLPackage::SetByte(unsigned char cByte)
{
return PutVar((char*)&cByte,sizeof(unsigned char));
}
//##ModelId=3E795F8702F3
long CLPackage::SetDword(unsigned long dData)
{
dData=htonl_my(dData);
return PutVar((char*)&dData,sizeof(unsigned long));
}
//##ModelId=3E795F8702E9
long CLPackage::SetWord(unsigned short dData)
{
dData=htons_my(dData);
return PutVar((char*)&dData,sizeof(unsigned short));
}
//##ModelId=3E795F8702DF
long CLPackage::SetInt(int iData)
{
iData=htonl_my(iData);
return PutVar((char*)&iData,sizeof(int));
}
//##ModelId=3E795F8702D4
long CLPackage::SetStr(char *szData)
{
return PutVar(szData,strlen(szData));
}
//##ModelId=3E795F8702CB
char* CLPackage::GetBuf()
{
return m_szBuf;
}
//##ModelId=3E795F8702CA
long CLPackage::GetLength()
{
return m_lBufLen;
}
//##ModelId=3E795F8702B7
long CLPackage::SetStrByLen(char *szData, long lLength)
{
if(szData==NULL)
{
m_lBufLen+=lLength;
return false;
}
PutVar(szData,strlen(szData)+1);
m_lBufLen+=lLength-strlen(szData)-1;
return true;
}
//##ModelId=3E795F8702AD
long CLPackage::EndSetPackLen(long lLength)
{
if(lLength==-1)
lLength=m_lBufLen;
lLength-=lPackHeadLen;
long lTemp=htonl_my(lLength);
memcpy(m_szBuf+lLenWordPos,(char*)&lTemp,sizeof(long));
return true;
}
//##ModelId=3E795F8702A2
long CLPackage::AddBuf(char *szData, long lLen)
{
return PutVar(szData,lLen);
}
//##ModelId=3E795F870299
long CLPackage::GetPackage(CLPackage &cPack)
{
//printf("%s\n",m_szBuf);
if(m_lBufLen<(lLenWordPos+4))
return false;
//=================
long lFlag=0;
memcpy(&lFlag,m_szBuf,4);
lFlag=htonl_my(lFlag);
if(lFlag!=GAME_MAGIC)
{
InitPack();
return -1;
}
//======================
long lLength=0;
memcpy(&lLength,m_szBuf+lLenWordPos,4);
lLength=htonl_my(lLength);
lLength+=lPackHeadLen;//報文全長
if(lLength>PACK_BUF_SIZE)//錯誤的報文
{
InitPack();
return -1;
}
if(lLength>m_lBufLen)
return false;
char szTemp[PACK_BUF_SIZE];
GetVar(szTemp,lLength);
cPack.InitPack();
cPack.SetBuffer(szTemp,lLength);
return true;
}
//##ModelId=3E795F870284
long CLPackage::MakeHead(long lCommand,unsigned long lSque)
{///rebuild
InitPack();
SetInt(0);
SetInt(htonl_my(lCommand));
SetDword(htonl_my(NULL));
SetDword(htonl_my(lSque));
EndSetPackLen();
return true;
}
//##ModelId=3E795F87027A
long CLPackage::SetStr2(char *szData)
{
return PutVar(szData,strlen(szData)+1);
}
//##ModelId=3E795F870270
void CLPackage::Set(long lWordPos, long lHeadLen)
{
lLenWordPos =lWordPos;//設置報文中放長度的long的位置
lPackHeadLen =lHeadLen; //報文全長=PACK_HEAD_LEN + 報文中標記長度
}
//##ModelId=3E795F870266
long CLPackage::htonl_my(long lTemp)
{
byte* szPoint=(byte*)&lTemp;
byte bTemp=szPoint[3];
szPoint[3]=szPoint[0];
szPoint[0]=bTemp;
bTemp=szPoint[2];
szPoint[2]=szPoint[1];
szPoint[1]=bTemp;
return lTemp;
}
//##ModelId=3E795F87025B
short CLPackage::htons_my(short sTemp)
{
byte* szPoint=(byte*)&sTemp;
byte bTemp=szPoint[1];
szPoint[1]=szPoint[0];
szPoint[0]=bTemp;
return sTemp;
}
//##ModelId=3E795F870252
BOOL CLPackage::GetStringByByteLen(char *szBuf, long lBufLen)
{
if(szBuf==NULL)
return FALSE;
long lLen=GetByte();
if(lLen>lBufLen)
return FALSE;
return GetStrByLen(szBuf,lLen);
}
//##ModelId=3E795F870233
BOOL CLPackage::GetStringByShortLen(char *szBuf, long lBufLen)
{
if(szBuf==NULL)
return FALSE;
long lLen=GetWord();
if(lLen>lBufLen)
return FALSE;
return GetStrByLen(szBuf,lLen);
}
//##ModelId=3E795F87023D
BOOL CLPackage::GetStringByLongLen(char *szBuf, long lBufLen)
{
if(szBuf==NULL)
return FALSE;
long lLen=GetDword();
if(lLen>lBufLen)
return FALSE;
return GetStrByLen(szBuf,lLen);
}
//##ModelId=3E795F87022A
BOOL CLPackage::SetStringAndByteLen(char *szBuf)
{
if(szBuf==NULL)
return FALSE;
long lLen=strlen(szBuf);
if(lLen>255)
return FALSE;
SetByte((byte)lLen);
return SetStrByLen(szBuf,lLen);
}
//##ModelId=3E795F870220
BOOL CLPackage::SetStringAndShortLen(char *szBuf)
{
if(szBuf==NULL)
return FALSE;
long lLen=strlen(szBuf);
SetWord((short)lLen);
return SetStrByLen(szBuf,lLen);
}
//##ModelId=3E795F870215
BOOL CLPackage::SetStringAndLongLen(char *szBuf)
{
if(szBuf==NULL)
return FALSE;
long lLen=strlen(szBuf);
SetDword(lLen);
return SetStrByLen(szBuf,lLen);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -