Example #1
0
void CCNetDelegate::close()
{
	if( m_eStatus == eSocketConnected )
	{
		unregisterScheduler();
		m_oSocket.ccClose();
		m_eStatus = eSocketIoClosed;
		onDisconnected();
	}
}
Example #2
0
void CNetDelegate::disconnect()
{
	if( m_eStatus == eSocketConnected )
	{
		unregisterScheduler();
		m_oSocket.ccDisconnect();
		m_eStatus = eSocketDisconnected;
		onDisconnected();
	}
}
Example #3
0
bool CCNetDelegate::runRead()
{
	int nRet = m_oSocket.ccRead(m_pReadBuffer, SOCKET_READ_BUFFER_SIZE);
	if( nRet == eSocketIoError || nRet == eSocketIoClosed )
	{
		unregisterScheduler();
		m_oSocket.ccClose();
		m_eStatus = eSocketIoClosed;
		onDisconnected();
		return true;
	}
	else
	{
#if 1
		CCLOG("CCSOCKET READ %d", nRet);
#endif
		m_oReadBuffer.writeData(m_pReadBuffer, (unsigned int)nRet);
#if USING_PACKAGE_HEAD_LENGTH
		while( m_oReadBuffer.isReadable(sizeof(int)) )
		{
			m_oReadBuffer.moveReaderIndexToFront();
			int n_head_len = m_oReadBuffer.readInt();
			if( n_head_len <= 0 )
			{
				CCLOGERROR("invalidate head length");
				m_oReadBuffer.moveLeft(sizeof(int));
			}

			int n_content_len = (int)m_oReadBuffer.length();
			if( n_content_len - (int)(sizeof(int)) >= n_head_len )
			{
				m_oReadBuffer.moveLeft(sizeof(unsigned int));
				CCBuffer* pData = m_oReadBuffer.readData(n_head_len);
				m_oReadBuffer.moveLeft(n_head_len);
				m_oReadBuffer.moveReaderIndexToFront();
				m_oReadBuffer.moveWriterIndexToBack();

				onMessageReceived(*pData);
			}
			else
			{
				break;
			}
		}
#else
		CCBuffer* pData = (CCBuffer*) m_oReadBuffer.copy();
		pData->autorelease();
		m_oReadBuffer.clear();
		
		onMessageReceived(*pData);
#endif
	}
	return false;
}
Example #4
0
void CCNetDelegate::runSchedule(float dt)
{
	switch( m_eStatus )
	{
	case eSocketConnecting:
		{
			switch( m_oSocket.ccIsConnected() )
			{
			case eSocketConnected:
				{
					m_eStatus = eSocketConnected;
					onConnected();
				}
				break;
			case eSocketConnectFailed:
				{
					unregisterScheduler();
                    m_oSocket.ccClose();
					m_eStatus = eSocketConnectFailed;
					onExceptionCaught(eSocketConnectFailed);
				}
				break;
			case eSocketConnecting:
				{
					if( m_fConnectingDuration > m_fSoTimeout )
					{
						unregisterScheduler();
						m_oSocket.ccDisconnect();
						m_eStatus = eSocketDisconnected;
						onConnectTimeout();
						m_fConnectingDuration = 0.0f;
					}
					else
					{
						m_fConnectingDuration += dt;
					}
				}
				break;
			default:
				break;
			}
		}
		break;
	case eSocketConnected:
		{
#if HANDLE_ON_SINGLE_FRAME
			while( m_oSocket.ccIsReadable() )
#else
			if( m_oSocket.ccIsReadable() )
#endif
			{
				if( this->runRead() ) return;
			}

#if HANDLE_ON_SINGLE_FRAME
			while( m_oSocket.ccIsWritable() && !m_lSendBuffers.empty() )
#else
			if( m_oSocket.ccIsWritable() && !m_lSendBuffers.empty() )
#endif
			{
				if( this->runWrite() ) return;
			}
		}
		break;
	default:
		break;
	}	
}
Example #5
0
bool CCNetDelegate::runReadByte()
{
    int nRet = m_oSocket.ccRead(m_pReadBuffer + m_wRecvSize, sizeof(m_pReadBuffer) - m_wRecvSize);
    if( nRet == eSocketIoError || nRet == eSocketIoClosed )
    {
        unregisterScheduler();
        m_oSocket.ccClose();
        m_eStatus = eSocketIoClosed;
        onDisconnected();
        return true;
    }
    else
    {
#if 1
        CCLOG("CCSOCKET READ %d", nRet);
#endif
        m_wRecvSize += nRet;
        BYTE cbDataBuffer[SOCKET_BUFFER+sizeof(CMD_Head)];
        WORD wPacketSize = 0;
        CMD_Head * pHead = (CMD_Head *)m_pReadBuffer;
        while( m_wRecvSize >= sizeof(CMD_Head) )
        {
            //效验参数
            wPacketSize = pHead->CmdInfo.wPacketSize;
            //            ASSERT(pHead->CmdInfo.cbVersion == SOCKET_VER);
            //            ASSERT(wPacketSize <= (SOCKET_BUFFER + sizeof(CMD_Head)));
            if (pHead->CmdInfo.cbVersion != SOCKET_VER) throw std::string("数据包版本错误");
            if (wPacketSize > (SOCKET_BUFFER + sizeof(CMD_Head))) throw std::string("数据包太大");
            if (m_wRecvSize < wPacketSize) return 1;
            
            //拷贝数据
            m_dwRecvPacketCount++;
            
            memcpy(cbDataBuffer, m_pReadBuffer, wPacketSize);
            m_wRecvSize -= wPacketSize;
            memcpy(m_pReadBuffer, m_pReadBuffer + wPacketSize, m_wRecvSize);
            
            //解密数据
            WORD wRealySize=CrevasseBuffer(cbDataBuffer,wPacketSize);
            
            //解释数据
            WORD wDataSize = wRealySize - sizeof(CMD_Head);
            void * pDataBuffer = cbDataBuffer + sizeof(CMD_Head);
            CMD_Command Command = ((CMD_Head *)cbDataBuffer)->CommandInfo;
            
            //内核命令
            if (Command.wMainCmdID == MDM_KN_COMMAND)
            {
                switch (Command.wSubCmdID)
                {
                    case SUB_KN_DETECT_SOCKET:	//网络检测
                    {
                        //发送数据
                        sendPacket(MDM_KN_COMMAND, SUB_KN_DETECT_SOCKET, pDataBuffer, wDataSize);
                        break;
                    }
                }
                continue;
            }
            
            //处理数据
            //            bool bSuccess = m_pITCPSocketSink->OnEventTCPSocketRead(GetSocketID(), Command, pDataBuffer, wDataSize);
            //            if (bSuccess == false) throw std::string("网络数据包处理失败");
            
            onMessageReceived((const char *)cbDataBuffer, wRealySize);
        }
    }
    return false;
}