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; }
template <class HANDLER> void ACE_Asynch_Connector<HANDLER>::handle_connect (const ACE_Asynch_Connect::Result &result) { // Variable for error tracking int error = 0; // If the asynchronous connect fails. if (!result.success () || result.connect_handle () == ACE_INVALID_HANDLE) { error = 1; } if (result.error () != 0) { error = 1; } // set blocking mode if (!error && ACE::clr_flags (result.connect_handle (), ACE_NONBLOCK) != 0) { error = 1; ACELIB_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("ACE_Asynch_Connector::handle_connect : Set blocking mode"))); } // Parse the addresses. ACE_INET_Addr local_address; ACE_INET_Addr remote_address; if (!error && (this->validate_new_connection_ || this->pass_addresses_)) this->parse_address (result, remote_address, local_address); // Call validate_connection even if there was an error - it's the only // way the application can learn the connect disposition. if (this->validate_new_connection_ && this->validate_connection (result, remote_address, local_address) == -1) { error = 1; } HANDLER *new_handler = 0; if (!error) { // The Template method new_handler = this->make_handler (); if (new_handler == 0) { error = 1; ACELIB_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("ACE_Asynch_Connector::handle_connect : Making of new handler failed"))); } } // If no errors if (!error) { // Update the Proactor. new_handler->proactor (this->proactor ()); // Pass the addresses if (this->pass_addresses_) new_handler->addresses (remote_address, local_address); // Pass the ACT if (result.act () != 0) new_handler->act (result.act ()); // Set up the handler's new handle value new_handler->handle (result.connect_handle ()); ACE_Message_Block mb; // Initiate the handler with empty message block; new_handler->open (result.connect_handle (), mb); } // On failure, no choice but to close the socket if (error && result.connect_handle() != ACE_INVALID_HANDLE) ACE_OS::closesocket (result.connect_handle ()); }