派生

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值