本文整理汇总了C++中Session::OnRecvCompleted方法的典型用法代码示例。如果您正苦于以下问题:C++ Session::OnRecvCompleted方法的具体用法?C++ Session::OnRecvCompleted怎么用?C++ Session::OnRecvCompleted使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Session
的用法示例。
在下文中一共展示了Session::OnRecvCompleted方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: HandleRecv
void IOCPPool::HandleRecv(Session& ikey)
{
if(ikey.m_nPendingRecv.get()==0)
{
return;
}
for(;;)
{
TempOlapPtr q=ikey.lkfq_recv.getq();
if(!q)
{
break;
}
if(q->type==MyOverLapped::ACTION_WAIT_RECV)
{
ikey.m_nPendingRecv--;
ikey.OnRecvReady();
break;
}
if(q->type==MyOverLapped::ACTION_UDP_RECV)
{
int bRet=ikey.sk_local.sock.recv(q->dbuf[0].buf,q->dbuf[0].len,q->peer);
if(bRet>0)
{
q->size=bRet;
accounter.nRecvBytes.fetch_add(bRet);
accounter.nSendCount++;
ikey.m_nPendingRecv--;
ikey.OnRecvCompleted(q);
break;
}
else if(bRet<0)
{
ikey.m_nPendingRecv--;
ikey.Disconnect();
break;
}
else
{
ikey.m_nPendingRecv--;
this_logger().LogMessage("recv udp failed");
}
break;
}
q->size=0;
for(;;)
{
int bRet=ikey.sk_local.sock.recv(q->dbuf[0].buf+q->size,q->dbuf[0].len-q->size);
if(bRet<0)
{
if(errno==EAGAIN)
{
break;
}
if(errno==EINTR)
{
continue;
}
ikey.Disconnect();
break;
}
else if(bRet==0)
{
break;
}
q->size+=bRet;
break;
}
if(q->size>0)
{
accounter.nRecvCount++;
accounter.nRecvBytes.fetch_add(q->size);
ikey.m_nPendingRecv--;
ikey.OnRecvCompleted(q);
}
else
{
ikey.m_nPendingRecv--;
}
break;
}
}