void Client::AsyncCreateConnPtr( AsyncCreateConnFtr ftr, uint32_t timeout ) { SocketTypeUPtr sockPtr(smartPtr::make_unique<SocketType>(ImpUPtr_->AsyncThreadPool_->GetProactor().ImpSPtr_->ProactorRef_)); SCopybleWrap<SocketTypeUPtr>::SCopyblePtr copySockPtr = mori::make_shared<SCopybleWrap<SocketTypeUPtr>>(sockPtr); ContinueFlagSPtr flagSPtr; DeadlineTimerTypePtr timerSPtr; if ( 0 != timeout ) { flagSPtr = smartPtr::make_shared<ContinueFlag>(true); timerSPtr = smartPtr::make_shared<DeadlineTimerType>(ImpUPtr_->AsyncThreadPool_->GetProactor().ImpSPtr_->ProactorRef_); } copySockPtr->Ptr_->async_connect(ImpUPtr_->ServerEP_, [copySockPtr, ftr, flagSPtr, timerSPtr](const ErrCode ec) { if ( flagSPtr && !flagSPtr->load() ) { ftr(boost::asio::error::timed_out, TcpConnectionSPtr()); return; } else if ( timerSPtr ) { ErrCode dtEc; timerSPtr->cancel(dtEc); } if ( !ec ) { TcpSocket sockWrap; sockWrap.SockUPtr_ = std::move(copySockPtr->Ptr_); TcpConnectionSPtr connPtr = mori::make_shared<TcpConnection>(sockWrap); ftr(ec, connPtr); } else { ftr(ec, TcpConnectionSPtr()); } }); if ( 0 != timeout ) { timerSPtr->expires_from_now(boost::posix_time::seconds(timeout)); timerSPtr->async_wait([flagSPtr, copySockPtr](ErrCode ec) { if ( !ec ) { flagSPtr->store(false); if ( copySockPtr->Ptr_ ) { copySockPtr->Ptr_->close(ec); } } }); } }
SessionID CTcpSessionManager::AddConnector(const tagConnctorConfigTraits & traits) { if (m_mapConnectorConfig.find(traits.cID) != m_mapConnectorConfig.end() || traits.cID == InvalidConnectorID) { LOGE("AddConnector confilict ConnectorID. ConnectorID=" << traits.cID << ", remoteAdress=" << traits.remoteIP << ":" << traits.remotePort); return traits.cID; } m_mapConnectorConfig[traits.cID].first = traits; CTcpSocketPtr sockPtr(new zsummer::network::CTcpSocket()); sockPtr->Initialize(m_summer); CTcpSessionPtr sessionPtr(new CTcpSession()); sessionPtr->BindTcpConnectorPtr(sockPtr, m_mapConnectorConfig[traits.cID]); return traits.cID; }
bool CTcpSessionManager::AddConnector(ConnectorID cID) { auto founder = m_mapConnectorConfig.find(cID); if (founder == m_mapConnectorConfig.end()) { LOGE("AddConnector can not found ConnectorID. ConnectorID=" << cID); return false; } CTcpSocketPtr sockPtr(new zsummer::network::CTcpSocket()); sockPtr->Initialize(m_summer); CTcpSessionPtr sessionPtr(new CTcpSession()); sessionPtr->BindTcpConnectorPtr(sockPtr, founder->second); return true; }
void CTcpSessionManager::OnConnectorStatus(ConnectorID connectorID, bool bConnected, CTcpSessionPtr session) { auto config = m_mapConnectorConfig.find(connectorID); if (config == m_mapConnectorConfig.end()) { LOGE("Unkwon Connector. Not Found ConnectorID=" << connectorID); return; } if (bConnected) { m_mapConnectorPtr[connectorID] = session; config->second.second.curReconnectCount = 0; config->second.second.totalConnectCount++; Post(std::bind(&CMessageDispatcher::DispatchOnConnectorEstablished, &CMessageDispatcher::getRef(), connectorID)); return; } auto iter = m_mapConnectorPtr.find(connectorID); if (!bConnected && iter != m_mapConnectorPtr.end()) { m_mapConnectorPtr.erase(connectorID); Post(std::bind(&CMessageDispatcher::DispatchOnConnectorDisconnect, &CMessageDispatcher::getRef(), connectorID)); } if (!bConnected && config->second.second.curReconnectCount > 0 && config->second.second.curReconnectCount < config->second.first.reconnectMaxCount) { config->second.second.curReconnectCount++; CTcpSocketPtr sockPtr(new zsummer::network::CTcpSocket()); sockPtr->Initialize(m_summer); static const bool EnableFastConnect = false;//fast reconnect. Be careful of remote server access denied. if (config->second.second.curReconnectCount == 1 && EnableFastConnect) { Post(std::bind(&CTcpSession::BindTcpConnectorPtr, session, sockPtr, config->second)); } else { CreateTimer(config->second.first.reconnectInterval, std::bind(&CTcpSession::BindTcpConnectorPtr, session, sockPtr, config->second)); } } else if (config->second.first.reconnectMaxCount > 0) { LOGE("Try Reconnect Failed. End Try. Traits=" << config->second.first); } }
mori::TcpConnectionSPtr Client::CreateConnPtr( ErrCode& ec/*=ErrCode()*/ ) { SocketTypeUPtr sockPtr(smartPtr::make_unique<SocketType>(ImpUPtr_->AsyncThreadPool_->GetProactor().ImpSPtr_->ProactorRef_)); TcpSocket sockWrap; sockWrap.SockUPtr_ = std::move(sockPtr); sockPtr->connect(ImpUPtr_->ServerEP_, ec); if ( ec ) { return TcpConnectionSPtr(); } TcpConnectionSPtr connPtr = mori::make_shared<TcpConnection>(sockWrap); return connPtr; }