bool NetChannelBase::FlushStream() { bool bError = false; while (m_StreamOut.GetSize() > 0) { int32 nLen = (int32)m_StreamOut.GetSize(); int32 nRet = m_socket.Send((char*)m_StreamOut.GetBufferStart(), nLen); if( nRet < 0 ) { int32 nError = Socket::GetSysError(); if( nError == MY_EWOULDBLOCK || nError == MY_EAGAIN ) break; else if( nError == MY_ECONNRESET ) nRet = 0; else { SockAddr addr; m_socket.GetSockAddr(addr); MyLog::error("[%s:%u] IO Error [%d] when sending data !", addr.GetIP().c_str(), addr.GetPort(), GetID(), nError); DisConnect(); nError = true; break; } } if( nRet == 0 ) { SockAddr addr; m_socket.GetPeerAddr(addr); MyLog::error("NetChannelBase::flushStream() [%s:%u][%u] connection is closed!", addr.GetIP().c_str(), addr.GetPort(), GetID()); DisConnect(); bError = true; break; } m_pMgr->BytesSend().Add(nRet); m_StreamOut.Remove(nRet); m_nTotalSendByte += nRet; if( nRet < nLen ) break; } return !bError; }
int32 NetChannelBase::RecvData(char* buffer, int32 nLen) { int32 nRet = m_socket.Recv( buffer, nLen, 0); if(nRet < 0) { int32 nError = Socket::GetSysError(); if( MY_EWOULDBLOCK == nError || MY_EAGAIN == nError ) return 0; else if( MY_ECONNRESET == nError ) { SockAddr addr; m_socket.GetPeerAddr(addr); MyLog::error("NetChannelBase::recvData() [%s:%u][%u] An existing connection was forcibly closed by thre remote host!", addr.GetIP().c_str(), addr.GetPort(), GetID()); return -1; } else { SockAddr addr; m_socket.GetSockAddr(addr); MyLog::error("[%s:%u][%u] IO error [%d] when sending data !", addr.GetIP().c_str(), addr.GetPort(), GetID(), nError); return -1; } } if(nRet == 0) { SockAddr addr; m_socket.GetPeerAddr(addr); MyLog::error("NetChannelBase::recvData() [%s:%u][%u] remote connection is closed!", addr.GetIP().c_str(), addr.GetPort(), GetID()); return -1; } m_pMgr->BytesRecv().Add(nRet); return nRet; }
void NetManager::ProcNewConnection() { std::deque<NetChannelBase*> tmpQueue; { AUTOLOCK( m_mutexChannels); tmpQueue.swap(m_newSocketQueue); } while (!tmpQueue.empty()) { NetChannelBase* pChannel = tmpQueue.front(); assert( pChannel); int32 nSocketID = AddChannel( pChannel ); if(nSocketID < 0) { // channel list is full , can't add another one MyLog::warning("NetManager::ProcNewConnection() socket list is full"); break; } pChannel->StartChannel(); OnChannelStart( pChannel ); if(pChannel->m_bCreateByAccept) { if(m_AcceptCallBack) (*m_AcceptCallBack)(nSocketID); } else { if(m_ConnectCallBack) (*m_ConnectCallBack)(nSocketID); } tmpQueue.pop_front(); if(pChannel->m_hProcNewNotify.IsValid()) pChannel->m_hProcNewNotify.SetEvent(); FreeChannel( pChannel ); } // failed process while (!tmpQueue.empty()) { NetChannelBase* pChannel = tmpQueue.front(); tmpQueue.pop_front(); assert(pChannel); if(pChannel->m_hProcNewNotify.IsValid()) { AUTOLOCK(m_mutexChannels); m_newSocketQueue.push_back( pChannel ); } else { SockAddr addr; pChannel->GetAddr( addr ); MyLog::warning("NetManager::ProcNewConnection() drop new socket (%s:%d)", addr.GetIP().c_str(), addr.GetPort()); FreeChannel(pChannel); } } }