您当前的位置: 主页网站优化软件知识

用环形缓冲实现拼包函数

发布于:2014-03-17 18:40:56  作者:兄弟网络   点击:

大家都知道,网络tcp,流socket是不能保证收到的包是逻辑完整的,也许一个逻辑完整的被分成两段发送,所以我们使用流socket就需要将接收的包(物理包),网站优化,经过整理变成逻辑包。然后再处理。这个整理包的函数就是所说的拼包函数。下面的代码用环形缓冲实现了一个拼包函数。环形缓冲可以减少不必要memcpy,从而提高效率。

//这是per-I/O数据。它包含了在套节字上处理I/O操作的必要信息

structTPerIoData

{

OVERLAPPEDol;//重叠io,必须为第一个数据

WSABUFdataBuf;//投递数据时的结构

charbuff[IO_BUF_LEN];//接收或发送的io数据的buffer

intbufferLen;//buffer长度

SOCKETsClient;//在Accept一个连接后,通过它传递连接的客户端

intopType;//操作类型:Operation_type

};


//这是per-Handle数据。它包含了一个套节字的信息

structTIOCPContext

{

SOCKETs;//套节字句柄

SOCKADDR_INaddrRemote;//连接的远程地址

BOOLbClosing;//套节字是否关闭

intnPostNum;//此套节字上抛出的重叠操作的数量

BYTE*lpBufBegin;//拼包缓冲区头指针

BYTE*lpBufEnd;//拼包缓冲区尾指针

intarrayDataLen;//拼包缓冲目前长度

BYTEarrayDataBuf[USE_DATA_LONGTH];//拼包缓冲区

CRITICAL_SECTIONLock;//保护这个结构

};


boolCUserServer::SplitPacket(TIOCPContext*pContext,TPerIoData*pBuffer,char*outBuf)
{

intrecvedCount=pBuffer->bufferLen;//收到的数据长度

//守卫pContext结构

CGuardLock(&pContext->Lock);

//如果缓冲区不够,说明包格式有问题,则丢弃数据

if(USE_DATA_LONGTH-pContext->arrayDataLenlpBufBegin=pContext->lpBufEnd=pContext->arrayDataBuf;

pContext->arrayDataLen= 0;

return false;

}


intlastLen;

//将接收的数据copy到整理缓冲区

if(pContext->lpBufEndlpBufBegin)//假如尾指针在头指针前面
{

memcpy(pContext->lpBufEnd,pBuffer->buff,recvedCount);
}
else
{

lastLen=USE_DATA_LONGTH-(pContext->lpBufEnd-pContext- >arrayDataBuf);//尾指针到缓冲最后位置的大小

if(lastLenlpBufEnd,pBuffer->buff,lastLen);

memcpy(pContext->arrayDataBuf,pBuffer- >buff+lastLen,recvedCount-lastLen);


}

else

{

memcpy(pContext->lpBufEnd,pBuffer->buff,recvedCount);

}

}

//更新尾指针

if(lastLenlpBufEnd=pContext->arrayDataBuf+recvedCount-lastLen;

}

else

{

pContext->lpBufEnd+=recvedCount;

}

//更新缓冲长度

pContext->arrayDataLen+=recvedCount;


//按照包格式判断包是否完整,包格式=type(4byte)+packetlen(4byte)+content

if(pContext->arrayDataLen< 8)//收到的包不完整

{

//返回,网站SEO,等下次再整理

return false;

}

本文关键词: 函数| 实现| 环形| 缓冲| 拼包|

[相关阅读]

我们介绍

  兄弟网络科技工作室,专业从事织梦模板,日照百度优化,日照网站建设,日照网络公司,日照网站制作,日照网站优化,日照软件制作。如果您感觉我们不错请分享↓给更多的人

收缩