int CCommSvr::RecvMessage(ClientSocket* pClientSocket)
{
int iRet = 0;
if( NULL == pClientSocket || 0 == pClientSocket->bytesTransferred )
return 0;
//判断半包和粘包
int n_offset = 0;
const INT dataLen = pClientSocket->bytesTransferred + pClientSocket->olex.ol.Offset; //当前接受和以前缓存的数据之和
UINT nStart=0,nEnd=0;
int nDataBufLen = dataLen;
ASNS::CProtocolAnalysor protocolAnalysor;
{
//由于TCP会粘包,所有需要找完整包
while(protocolAnalysor.CheckDataPackageIntegrated((byte *)pClientSocket->olex.buf + n_offset,nDataBufLen,
&nStart,&nEnd))
{
int nPackageRealLen=nEnd-nStart;
protocolAnalysor.Analyse(pClientSocket->olex.buf + n_offset +nStart, nPackageRealLen);
if (protocolAnalysor.CheckPackageCRC16())
{
ProcessSvrMessage(pClientSocket,protocolAnalysor);
}
else
{
//Log err
CommSvrLog("CCommSvr::RecvMessage/
---crc 验证失败./r/n");
}
n_offset += nEnd;
nDataBufLen = dataLen - n_offset;
}
//如果接收的数据不够一个包,则修改offset
if (n_offset == 0 && dataLen < DATA_BUF_LENGHT)
{
pClientSocket->olex.ol.Offset = dataLen - n_offset;
pClientSocket->olex.wsabuf.buf = pClientSocket->olex.buf + pClientSocket->olex.ol.Offset;
}
//把粘包的数据移动到Buffer前面
else if ( n_offset > 0 )
{
pClientSocket->olex.ol.Offset = dataLen - n_offset;
if (pClientSocket->olex.ol.Offset < 0 || pClientSocket->olex.ol.Offset > DATA_BUF_LENGHT)
{
pClientSocket->olex.ol.Offset = 0;
pClientSocket->olex.wsabuf.buf = pClientSocket->olex.buf;
}
else
{
memmove(pClientSocket->olex.buf, pClientSocket->olex.buf + n_offset ,
pClientSocket->olex.ol.Offset);
pClientSocket->olex.wsabuf.buf = pClientSocket->olex.buf + pClientSocket->olex.ol.Offset;
}
}
//半包,等待下次读取
else if ( dataLen >= DATA_BUF_LENGHT) //太多垃圾数据,丢弃
{
pClientSocket->olex.ol.Offset = 0;
pClientSocket->olex.wsabuf.buf = pClientSocket->olex.buf;
CommSvrLog("CCommSvr::RecvMessage/
---太多垃圾数据,丢弃./r/n");
}
}
return 0;
}