本文整理汇总了C++中CBuffer::GetDataLen方法的典型用法代码示例。如果您正苦于以下问题:C++ CBuffer::GetDataLen方法的具体用法?C++ CBuffer::GetDataLen怎么用?C++ CBuffer::GetDataLen使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CBuffer
的用法示例。
在下文中一共展示了CBuffer::GetDataLen方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SendData
void CNiThread::SendData(CBuffer& bufDataSnd,const CString& strClientAddr)
{
if(bufDataSnd.GetDataLen()<=0 || strClientAddr.GetLength()<=0)
return;
NI_TASK_PARAM_TYPE* pNiTask = new NI_TASK_PARAM_TYPE;
if(pNiTask != NULL)
{
//pNiTask->pSendData = &bufDataSnd;
pNiTask->pSendData = new CBuffer();
if(pNiTask->pSendData!=NULL)
{
//加装数据包头
if(pNiTask->pSendData->Alloc(bufDataSnd.GetDataLen()+PACKAGE_HEAD_LEN))
{
//填写数据包头部
DWORD* pPackageEntityLen = (DWORD*)pNiTask->pSendData->GetBufP();
*pPackageEntityLen=bufDataSnd.GetDataLen();
pNiTask->pSendData->SetDataLen(PACKAGE_HEAD_LEN);
pNiTask->pSendData->AppendData(bufDataSnd);
//memcpy(pNiTask->pSendData,bufDataSnd.GetBufP(),bufDataSnd.GetDataLen());
//pNiTask->pSendData->SetDataLen(bufDataSnd.GetDataLen()+PACKAGE_HEAD_LEN);
}
}
//填写发送地址
pNiTask->strClientAddr = strClientAddr;
//提交发送任务
CommitNiTask(NITASK_SEND,pNiTask);
}
}
示例2: SendFile
void CNiThread::SendFile(CBuffer& bufDataSnd,const CString& strClientAddr)
{
if(bufDataSnd.GetDataLen()<=0 || strClientAddr.GetLength()<=0)
return;
NI_TASK_PARAM_TYPE* pNiTask = new NI_TASK_PARAM_TYPE;
if(pNiTask != NULL)
{
//pNiTask->pSendData = &bufDataSnd;
pNiTask->pSendData=new CBuffer(bufDataSnd.GetDataLen());
pNiTask->pSendData->SetData(bufDataSnd);
//填写发送地址
pNiTask->strClientAddr = strClientAddr;
//提交发送任务
CommitNiTask(NITASK_SEND,pNiTask);
}
}
示例3: OnSocketReceive
void CNiThread::OnSocketReceive(CNotifySocket* pSrcSocket,int nErrorCode)
{
//当进入预关闭流程时,拒绝外部请求
if(m_bPreShutdown)
return;
ClientSocketInfoType* pClientInfo = FindClientInfoByAddr(pSrcSocket);
if(pClientInfo!=NULL)
{
//获取Socket内部接收缓冲区长度
int nSocketRecvBufLen = 0;
int nSocketOptLen = sizeof(nSocketRecvBufLen);
pSrcSocket->GetSockOpt(SO_RCVBUF,&nSocketRecvBufLen,&nSocketOptLen);
//当资源不足时关闭对应Socket
BOOL bCloseSocket = FALSE;
while(TRUE)
{
CBuffer* pBufRecv;
pBufRecv=new CBuffer(nSocketRecvBufLen);
//pBufRecv->Alloc(nSocketRecvBufLen);
if(pBufRecv!=NULL)
{
int nRecvLen = pSrcSocket->Receive(pBufRecv->GetBufP(),nSocketRecvBufLen);
if(nRecvLen>0)
{
pBufRecv->SetDataLen(nRecvLen);
}
else
{
delete pBufRecv;
break;
}
}
else
{
bCloseSocket = TRUE;
break;
}
PROCESS_RECEIVE:
//数据入队
pClientInfo->queRecv.Add(pBufRecv);
pBufRecv = NULL;
//取缓存的数据总长度
DWORD nSumDataLen = 0;
for(int i=0;i<pClientInfo->queRecv.GetCount();++i)
{
nSumDataLen +=pClientInfo->queRecv[i]->GetDataLen();
}
if(pClientInfo->nPackageNeedRecv == 0)//在一个数据包接收任务的开始
{
//如果数据总长度超过包头长度
if(nSumDataLen>=PACKAGE_HEAD_LEN)
{
//合成数据
CBuffer* pBufCompose;
pBufCompose=new CBuffer(nSumDataLen);
//pBufCompose->Alloc(nSumDataLen);
if(pBufCompose != NULL)
{
BYTE* pOffset = pBufCompose->GetBufP();
//合成数据并清理包头缓存
while(pClientInfo->queRecv.GetCount()>0)
{
memcpy(pOffset,pClientInfo->queRecv[0]->GetBufP(),pClientInfo->queRecv[0]->GetDataLen());
pOffset += pClientInfo->queRecv[0]->GetDataLen();
delete pClientInfo->queRecv[0];
pClientInfo->queRecv.RemoveAt(0);
}
pBufCompose->SetDataLen(nSumDataLen);
//获得数据包有效数据长度
DWORD nPackageHead = *((int*)pBufCompose->GetBufP());
//根据数据长度进行不同的处理
if( nSumDataLen<nPackageHead+PACKAGE_HEAD_LEN)//如果总长度大于或等于头部长度且没超过需接收的长度,则还有多余的数据需要入接收队列
{
//设置待接收数据长度
pClientInfo->nPackageNeedRecv = nPackageHead ;
//剪除头部数据
pBufCompose->CutHeadData(PACKAGE_HEAD_LEN);
if(pBufCompose->GetDataLen()>0)
pClientInfo->queRecv.Add(pBufCompose);
else//接收数据长度刚好等于包头
delete pBufCompose;
}
else //if(nSumDataLen>=nPackageHead+PACKAGE_HEAD_LEN)//数据一次接够的
{
int nExtraLen = nSumDataLen-nPackageHead-PACKAGE_HEAD_LEN;
CBuffer *pNextMissonHead = NULL;
//缓存下次任务数据
if(nExtraLen>0)
//.........这里部分代码省略.........