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

📄 msgbag.cpp

📁 类似于QQ的聊天工具,分为客户端和服务器端,有共享空间,能发布公告,可传输文件
💻 CPP
字号:
// MsgBag.cpp: implementation of the CMsgBag class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MsgBag.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMsgBag::CMsgBag()
{

}


/*---------------------------------------------------------------------------
 基本数据完全打包
 --------------------------------------------------------------------------*/
void CMsgBag::DataPackage(CString& buff, tagPacketParam* param)
{
	CString  bufTmp   = "";                 //临时包
	char  strTmp[5]      = "";              //接收整形按字节转换字符串
	long  bagLen         = 0;               //包长
	long  parLen         = 0;               //参数长度
	
	bufTmp += param->order;                 //命令加入包
	
	bufTmp += param->Status;				//服务器消息返回状态(修)

	//////////////////////////////////
	//数据接收方
	parLen = param->SentTo.GetLength();

	ltoc(strTmp, parLen);
	bufTmp += strTmp;
	bufTmp += param->SentTo;

	ltoc(strTmp, param->paramNum);			 //把参数个数按字节转换字符串
	bufTmp += strTmp;					     //参数个数加入包
	
	//////////////////////////////////
	//打包帐号
	parLen = param->UserId.GetLength();
	if(parLen != 0)
	{
		ltoc(strTmp, parLen);
		bufTmp += strTmp;
		bufTmp += param->UserId;
	}

	//////////////////////////////////
	//打包密码
	parLen = param->UserPsw.GetLength();
	if(parLen != 0)
	{
		ltoc(strTmp, parLen);
		bufTmp += strTmp;
		bufTmp += param->UserPsw;
	}

	//////////////////////////////////
	//打包用户名
	parLen = param->UserName.GetLength();
	if(parLen != 0)
	{
		ltoc(strTmp, parLen);
		bufTmp += strTmp;
		bufTmp += param->UserName;
	}

	//////////////////////////////////
	//打包性别
	parLen = param->UserSex.GetLength();
	if(parLen != 0)
	{
		ltoc(strTmp, parLen);
		bufTmp += strTmp;
		bufTmp += param->UserSex;
	}

	//////////////////////////////////
	//打包部门
	parLen = param->UserDptm.GetLength();
	if(parLen != 0)
	{
		ltoc(strTmp, parLen);
		bufTmp += strTmp;
		bufTmp += param->UserDptm;
	}

	//////////////////////////////////
	//打包职务
	parLen = param->UserDuty.GetLength();
	if(parLen != 0)
	{
		ltoc(strTmp, parLen);
		bufTmp += strTmp;
		bufTmp += param->UserDuty;
	}

	//////////////////////////////////
	//打包电话
	parLen = param->UserTel.GetLength();
	if(parLen != 0)
	{
		ltoc(strTmp, parLen);
		bufTmp += strTmp;
		bufTmp += param->UserTel;
	}

	//////////////////////////////////
	//打包Email
	parLen = param->UserEmail.GetLength();
	if(parLen != 0)
	{
		ltoc(strTmp, parLen);
		bufTmp += strTmp;
		bufTmp += param->UserEmail;
	}

	/////////////////////////////////
	//聊天信息
	parLen = param->UserChar.GetLength();
	if(parLen != 0)
	{
		ltoc(strTmp, parLen);
		bufTmp += strTmp;
		bufTmp += param->UserChar;
	}

	/////////////////////////////////
	//生成发送包
	bagLen =  bufTmp.GetLength();
	ltoc(strTmp, bagLen);
	buff += strTmp;
	buff += bufTmp;
}


/*---------------------------------------------------------------------------
 基本数据完全拆包
 --------------------------------------------------------------------------*/
void CMsgBag::SplitDate(CString& buff, CString* strArray)
{

	CString  Tmp        = "";
	long     lTmp       = 0;
	long     GetDataPos = 0;
	CString a;

	///////////////////////////////
	//提取包长
	Tmp = buff.Mid(GetDataPos, INPACKET_FLAG_BYTE);
	GetDataPos += INPACKET_FLAG_BYTE;
	lTmp = ctol(Tmp.GetBuffer(0));

	///////////////////////////////
	//提取命令号
	Tmp = buff.Mid(GetDataPos, INPACKET_FLAG_BYTE);
	GetDataPos += INPACKET_FLAG_BYTE;
	
	///////////////////////////////
	//提取返回状态
	Tmp = buff.Mid(GetDataPos, INPACKET_FLAG_BYTE);
	GetDataPos += INPACKET_FLAG_BYTE;

	///////////////////////////////
	//提取发送方长度
	Tmp = buff.Mid(GetDataPos, INPACKET_FLAG_BYTE);
	GetDataPos += INPACKET_FLAG_BYTE;
	lTmp = ctol(Tmp.GetBuffer(0));

	///////////////////////////////
	//提取发送方
	Tmp = buff.Mid(GetDataPos, lTmp);
	GetDataPos += lTmp;

	///////////////////////////////
	//提取参数个数
	Tmp = buff.Mid(GetDataPos, INPACKET_FLAG_BYTE);
	GetDataPos += INPACKET_FLAG_BYTE;
	lTmp = ctol(Tmp.GetBuffer(0));

	int n = lTmp;

	for(int i = 0; i < n; i++)
	{
		///////////////////////////////
		//提取各参数的长度
		Tmp = buff.Mid(GetDataPos, INPACKET_FLAG_BYTE);
		GetDataPos += INPACKET_FLAG_BYTE;
		lTmp = ctol(Tmp.GetBuffer(0));

		///////////////////////////////
		//提取各参数
		strArray[i] = buff.Mid(GetDataPos, lTmp);
		GetDataPos += lTmp;
	}
}


CMsgBag::~CMsgBag()
{

}


/*---------------------------------------------------------------------------
 数据包中修改命令号
 --------------------------------------------------------------------------*/
void CMsgBag::ModifyOrderCode(CString &strOrder, CString& strDatePacket)
{
	strDatePacket.Delete(ORDER_CODE_POS, INPACKET_FLAG_BYTE);
	strDatePacket.Insert(ORDER_CODE_POS, strOrder.GetBuffer(0));
}


/*---------------------------------------------------------------------------
 获取数据包长度
 --------------------------------------------------------------------------*/
long CMsgBag::GetPacketLen(CString& strDatePacket)
{
	CString strPacketLen = strDatePacket.Left(4);
	return  ctol(strPacketLen.GetBuffer(0));
}


/*---------------------------------------------------------------------------
 获取数据包命令号并命令号转换成整形
 --------------------------------------------------------------------------*/
long CMsgBag::GetOrderCode(CString& strDatePacket)
{
	CString strOrderCode = strDatePacket.Mid(ORDER_CODE_POS, INPACKET_FLAG_BYTE);
	return atoi(strOrderCode.GetBuffer(0));
}


/*---------------------------------------------------------------------------
 获取数据包目的地用户帐号
 --------------------------------------------------------------------------*/
CString CMsgBag::GetDesUserId(CString& strDatePacket)
{	
	CString strUserIdLen;
	CString strDesUserId;

	strUserIdLen = strDatePacket.Mid(SENDTO_LENGTH_POS, INPACKET_FLAG_BYTE);
	long IdLen   = CDataBag::ctol(strUserIdLen.GetBuffer(0));

	strDesUserId = strDatePacket.Mid(SENDTO__POS, IdLen);
	return strDesUserId;
}


/*---------------------------------------------------------------------------
 设置数据包源用户帐号和帐号长度
 --------------------------------------------------------------------------*/
void CMsgBag::SetSourUserId(CString& strSourUserId, CString& strDatePacket)
{
	CString strOldIdLen;
	CString strDesUserId;

	strOldIdLen = strDatePacket.Mid(SENDTO_LENGTH_POS, INPACKET_FLAG_BYTE);
	long OldIdLen  = CDataBag::ctol(strOldIdLen.GetBuffer(0));
	strDatePacket.Delete(SENDTO_LENGTH_POS, OldIdLen + INPACKET_FLAG_BYTE);

	char strIdLen[5] = "";
	CDataBag::ltoc(strIdLen, strSourUserId.GetLength());
	strDatePacket.Insert(SENDTO_LENGTH_POS, strIdLen);
	strDatePacket.Insert(SENDTO__POS, strSourUserId.GetBuffer(0));
}


/*---------------------------------------------------------------------------
 修改数据包包长
 --------------------------------------------------------------------------*/
void CMsgBag::ModifyPacketLen(CString& strDatePacket)
{
	char strLen[5] = "";

	long len = strDatePacket.GetLength();
	CDataBag::ltoc(strLen, len - 4);

	strDatePacket.Delete(PACKET_LENGTH_POS, INPACKET_FLAG_BYTE);
	strDatePacket.Insert(PACKET_LENGTH_POS, strLen);
}

/*---------------------------------------------------------------------------
 截取包头
 --------------------------------------------------------------------------*/
CString CMsgBag::GetPacketHead(CString& strDatePacket)
{
	CString strHead;
	strHead = strDatePacket.Left(21);
	return strHead;
}


/*---------------------------------------------------------------------------
 设置服务器返回的消息状态
 --------------------------------------------------------------------------*/
void CMsgBag::SetRetStatus(CString& strStatus, CString& strDatePacket)
{
	strDatePacket.Delete(8, 4);
	strDatePacket.Insert(8, strStatus.GetBuffer(0));
}

/*---------------------------------------------------------------------------
  获取服务器返回的消息状态
 --------------------------------------------------------------------------*/
long CMsgBag::GetRetStatus(CString& strDatePacket)
{
	CString strStatus = strDatePacket.Mid(8, 4);
	return atol(strStatus.GetBuffer(0));
}

⌨️ 快捷键说明

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