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

📄 shpprequest.cpp

📁 本源码为移动公司话费查询中间件TUXEDO使用的实例
💻 CPP
字号:
/*******************************************
* file name:   SHPPRequest.h
* date:        2002.7.26
* 用途:       分解请求包
* 作者:       林游海
*******************************************/
#include "SHPPRequest.h"
#include "SHPPProtocol.h"

CSHPPRequest::CSHPPRequest(CSHPPSocket* pSocket)
:	CSHPPResponseStream(pSocket),
	m_pShppSocket(pSocket),
	m_nPacketLen(0),
	m_nServerType(0),
	m_nPacketM(1),
	m_nResult(0)
{
	memset(m_chPhone,0,knTelOffset);
}

CSHPPRequest::~CSHPPRequest()
{
}

KN_Error CSHPPRequest::Parse()
{
	LPSCHAR pRequest;
	int nReadLen;
//	this->Reset();
	m_pShppSocket->SetReadBuf();
	nReadLen = m_pShppSocket->ReadRtspHeaderLine((char**)&pRequest,10000);
	pRequest[nReadLen] = '\0';

	//接收的长度
	if(nReadLen < knPacketMinSize)
		return shppRequestErr;
	m_nServerType = CSHPPProtocol::GetServerType(pRequest);
	//判断版本是否错误

	GetTel(pRequest,m_chPhone);

	m_nPacketLen = CSHPPProtocol::GetPacketLen(pRequest);//m_pShppSocket->GetReadTotal();//
//	if(m_nPacketLen > (nReadLen - knPacketMinSize))
//		return shppRequestErr;

	if(memcmp(CSHPPProtocol::GetPacketBuffer(pRequest),CSHPPProtocol::s_pchEOL,CSHPPProtocol::s_unEOLLen) == 0)
		return KN_OK;

	//判断服务类型
//	if(m_nServerType == shppServerlife)
//		return this->SendError(KN_OK);
	if(m_nServerType < 0 || m_nServerType >= shppNumMethods)
		return shppRequestErr;

	return KN_OK;
}

//提取参数
LPSCHAR CSHPPRequest::GetParameter()
{
	return CSHPPProtocol::GetPacketBuffer((LPSCHAR)m_pShppSocket->GetReadBuf());

}

//获取下一个参数
KN_Error CSHPPRequest::GetNextParameter(UInt16 nIdex,char** ppOutParam)
{
	UInt16 i;
	UInt32 nLen;
	LPSCHAR lpParam;
	LPSCHAR lpParamI;
	LPSCHAR lpNext;

	lpNext = (LPSCHAR)ppOutParam;

	nLen = m_nPacketLen;
	lpParam = GetParameter();

	for(i = 0;i < nIdex; i++)
	{
		lpParamI = (LPSCHAR) memchr(lpParam,'\t',m_nPacketLen);
		if(lpParamI == NULL)
		{
			lpParamI = (LPSCHAR) memchr(lpParam,'\r',nLen);		
			if(lpParamI)
			{
				lpParamI = (LPSCHAR) memchr(lpParam,'\r',nLen);
				if((lpParamI - lpParam) >= (FIELDBUFFER -2))
				{
					lpNext[0] = '\0';
					return shppParameterErr;
				}

				memcpy(lpNext,lpParam,lpParamI - lpParam);
				lpNext[lpParamI - lpParam] = '\0';
				return 0;
				lpNext += FIELDBUFFER;
				nLen -= lpParamI - lpParam; 
			}else
				lpNext[0] = '\0';
			return 0;
		}
		else
		{
			if((lpParamI - lpParam) >= (FIELDBUFFER -2))
				return shppParameterErr;

			memcpy(lpNext,lpParam,lpParamI - lpParam);
			lpNext[lpParamI - lpParam] = '\0';
			lpNext += FIELDBUFFER;
			nLen -= lpParamI - lpParam; 
		}

		lpParam = lpParamI + 1;
	}

	return 0;
}

KN_Error CSHPPRequest::SendError(KN_Error knError,char* pError)
{
	if(knError < 0 || knError > shppNotDefine)
		knError = shppNotDefine;
	PutResult(knError);
	if(pError&&pError[0] !=0)
		PutParameter(pError);
	else
	{
		if(knError != KN_OK)
			PutParameter(CSHPPProtocol::GetErrorString(knError).m_pchPtr);
	}
	printf("请求处理出错:信息为 = %d.%s\n",knError,CSHPPProtocol::GetErrorString(knError).m_pchPtr);
	Flush();
	return KN_OK;

}

⌨️ 快捷键说明

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