Exemple #1
0
CProConnectClient* CProAsynchConnect::make_handler()
{
    CProConnectClient* pProConnectClient = new CProConnectClient();

    if(NULL != pProConnectClient)
    {
        //在这里设置连接的相关参数
        pProConnectClient->SetServerID(m_nServerID);
        uint32 u4PacketParseID = App_ClientProConnectManager::instance()->GetPacketParseID(m_nServerID);
        IClientMessage* pClientMessage = App_ClientProConnectManager::instance()->GetClientMessage(m_nServerID);

        if (u4PacketParseID > 0)
        {
            pProConnectClient->SetPacketParseInfoID(u4PacketParseID);
        }
        else
        {
            pProConnectClient->SetClientMessage(pClientMessage);
        }

        App_ClientProConnectManager::instance()->SetHandler(m_nServerID, pProConnectClient);

        SetConnectState(false);
    }
    else
    {
        SetConnectState(false);
    }

    return pProConnectClient;
}
BOOL ClientEngine::ConnectToServer( std::string strIpAddr, UINT16 sPort )
{
	SetConnectState(Start_Connect);

	m_hSocket = CommonSocket::CreateSocket(AF_INET, SOCK_STREAM, 0);
	if((m_hSocket == INVALID_SOCKET)||(m_hSocket == NULL))
	{
		printf("创建套接字失败!\n");

		SetConnectState(Not_Connect);

		return FALSE;
	}


	if(!CommonSocket::ConnectSocket(m_hSocket, strIpAddr.c_str(), sPort))
	{
		printf("连接服务器失败!\n");

		SetConnectState(Not_Connect);

		CommonSocket::CloseSocket(m_hSocket);

		return FALSE;
	}

	CommonSocket::SetSocketUnblock(m_hSocket);

	SetConnectState(Raw_Connect);

	return TRUE;
}
BOOL ClientEngine::ReceiveData()
{
	int nReadLen = recv(m_hSocket, m_DataBuffer + m_nDataLen, CONST_BUFF_SIZE - m_nDataLen, 0);
	if(nReadLen < 0)
	{
		DWORD nError = CommonSocket::GetSocketLastError();
		if(nError == WSAEWOULDBLOCK)
		{

		}
		else 
		{
			printf("接收数据发生错误:%s!\n", CommonSocket::GetLastErrorStr(nError).c_str());
		}

		return FALSE;
	}
	else if(nReadLen == 0)
	{
		printf("对方关闭了连接!\n");

		SetConnectState(Not_Connect); 

		CommonSocket::CloseSocket(m_hSocket);

		return FALSE;
	}
	else
	{
		m_nDataLen += nReadLen;
	}

	return TRUE;
}
BOOL ClientEngine::OnCmdConnectNotify(UINT16 wCommandID, UINT64 u64ConnID, CBufferHelper *pBufferHelper)
{
	StConnectNotify ConnectNotify;

	pBufferHelper->Read(ConnectNotify);

	UINT32 ConType = ConnectNotify.btConType;

	ConnectNotify.btConType =  TYPE_CLT_PLAYER;

	ConnectNotify.u64ConnID = m_u64ClientID;

	CBufferHelper WriteHelper(TRUE, &m_WriteBuffer);

	WriteHelper.BeginWrite(CMD_CONNECT_NOTIFY, CMDH_SVR_CON, 0, 0);

	WriteHelper.Write(ConnectNotify);

	WriteHelper.EndWrite();

	SendData(m_WriteBuffer.GetData(), m_WriteBuffer.GetDataLenth());

	if(ConType == TYPE_SVR_PROXY)
	{
		StCharEnterGameReq CharEnterGameReq;

		CharEnterGameReq.u64CharID = m_u64ClientID;

		CharEnterGameReq.dwIdentifyCode = m_dwIdentifyCode;

		CHECK_PAYER_ID(m_u64ClientID);

		CBufferHelper WriteHelper(TRUE, &m_WriteBuffer);

		WriteHelper.BeginWrite(CMD_CHAR_ENTER_GAME_REQ, CMDH_SENCE, 0, CharEnterGameReq.u64CharID);

		WriteHelper.Write(CharEnterGameReq);

		WriteHelper.EndWrite();

		SendData(m_WriteBuffer.GetData(),m_WriteBuffer.GetDataLenth());
	}
	else if(ConType == TYPE_SVR_LOGIN)
	{
		SetConnectState(Succ_Connect);
	}

	return 0;
}
Exemple #5
0
int CProAsynchConnect::validate_connection(const ACE_Asynch_Connect::Result& result, const ACE_INET_Addr& remote, const ACE_INET_Addr& local)
{
    //异步检验链接是否有效,如果有效
    int nError   = result.error();
    int nRet     = result.success ();
    ACE_HANDLE h = result.connect_handle();

    if (!nRet || h == ACE_INVALID_HANDLE)
    {
        SetConnectState(false);

        _ProConnectState_Info* pProConnectStateInfo = static_cast<_ProConnectState_Info* >(const_cast<void*>(result.act()));

        if(NULL != pProConnectStateInfo)
        {
            m_nServerID = pProConnectStateInfo->m_nServerID;
            SAFE_DELETE(pProConnectStateInfo);
        }

        ACE_INET_Addr remoteaddr = App_ClientProConnectManager::instance()->GetServerAddr(m_nServerID);
        App_ClientProConnectManager::instance()->SetServerConnectState(m_nServerID, SERVER_CONNECT_FAIL);
        OUR_DEBUG((LM_ERROR, "[CProAsynchConnect::validate_connection](%s:%d) connection fails,error=%d(ServerID=%d).\n", remoteaddr.get_host_addr(), remoteaddr.get_port_number(), nError, m_nServerID));
        m_nServerID = 0;

        return 1;
    }

    _ProConnectState_Info* pProConnectStateInfo = static_cast<_ProConnectState_Info* >(const_cast<void*>(result.act()));

    if(NULL != pProConnectStateInfo)
    {
        m_nServerID = pProConnectStateInfo->m_nServerID;
        SAFE_DELETE(pProConnectStateInfo);
    }


    //OUR_DEBUG((LM_ERROR, "[CProAsynchConnect::validate_connection]Connect IP=%s,Port=%d OK.\n", remote.get_host_addr(), remote.get_port_number()));
    return 0;
}
BOOL ClientEngine::SendData( char *pData, INT32 dwLen )
{
	if((pData == NULL)||(dwLen == 0))
	{
		ASSERT_FAIELD;
		return FALSE;
	}

	if((m_ConnectState != Succ_Connect)&&(m_ConnectState != Raw_Connect))
	{
		printf("没有连接服务器!\n");

		return FALSE;
	}

	int nWriteLen = send(m_hSocket,  (char*)pData, dwLen, 0);
	if(nWriteLen < 0)
	{
		DWORD nError = CommonSocket::GetSocketLastError();

		printf("发送数据发生错误:%s!\n", CommonSocket::GetLastErrorStr(nError).c_str());

		return FALSE;
	}
	else
	{
		if(nWriteLen < dwLen)
		{
			SetConnectState(Not_Connect);
			CommonSocket::CloseSocket(m_hSocket);
			return FALSE;
		}
	}

	return TRUE;
}