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; }
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; }