Ejemplo n.º 1
0
	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);
					}
				}
			});
		}
	}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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);
	}
}
Ejemplo n.º 5
0
	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;
	}