Example #1
0
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;
}
Example #2
0
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;
}
Example #3
0
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);
		}
	}
}