void CTcpSocket::on_inter_recv(short flag) { if (m_wait_recv.empty()) { m_io->Del_Event(&m_ev_read); return; } CIOBuffer* recvbuff = m_wait_recv.front(); int recvlen = ::recv(m_socket, recvbuff->GetCurWrite(), recvbuff->AvailWrite(), 0); if (recvlen == 0) { XH_LOG_INFO(logname_base, "[id:" << m_id << "] tcpsocket::recv failed, closed by peer"); on_inter_close(tcp_recvfail_closedbypeer, false); return; } else if (recvlen < 0) { if (isnoblockerr()) { ; } else { XH_LOG_WARN(logname_base, "[id:" << m_id << "] tcpsocket::recv failed, recv - 1"); on_inter_close(tcp_recvfail_recverr, false); } return; } bool bneedcb = false; recvbuff->SeekWrite(recvlen); // 如果是readsome if ( recvbuff->GetTag()==1 ) { bneedcb = true; } // 如果是读固定长度 else { // 如果读全了 if (recvbuff->AvailWrite()==0) { bneedcb = true; } } if ( !bneedcb ) { return; } switch (m_type) { case type_accepter: if (m_acb) { m_acb->On_Recv(GetSocketID(), tcp_ok, recvbuff); } break; case type_connecter: if (m_ccb) { m_ccb->On_Recv(GetSocketID(), tcp_ok, recvbuff); } break; default: break; } m_wait_recv.pop(); recvbuff->Release(); // 没有可以接收的缓存,则删除事件 if (m_wait_recv.empty()) { m_io->Del_Event(&m_ev_read); } }