Exemplo n.º 1
0
CClientSession* CClientManager::RetrieveSession( int nAlgorithm )
{
	CServerToken* pToken = NULL;
	while( true ){
		WaitForSemaphore( m_hSema );
		{
			CObjLocker<CClientManager> locker(this);
			multiset<CServerToken*, TokenCpuCmp>::iterator pos;
			switch( nAlgorithm ){
			case CMRS_FASTEST:
				pos = m_ServTokens.begin();
				break;
			case CMRS_SLOWEST:
				pos = m_ServTokens.begin();
				break;
			}
			ASSERT( pos!=m_ServTokens.end() );
			pToken = *pos;
			m_ServTokens.erase( pos );
			if( pToken->IsDead() ){			//remove the dead token
				m_PeerTokens.erase( pToken->GetServAddr() );
				pToken = NULL;
			}
		}
		if( pToken!=NULL )break;
	}

	pToken->SetState( CTS_RUNNING );
	CClientSession* pSession = new CClientSession( CSessionAddr(GetLocalHostAddr(), GetNextSessionId()), pToken );

	//get the proxy pointer, create the proxy if necessary
	IN_ADDR addrServ = pToken->GetServAddr().m_addrHost;
	CClientProxy* pClntProxy = NULL;
	{
		CObjLocker<CClientManager> locker(this);
		map<IN_ADDR, CClientProxy*>::iterator pos = m_ClntProxies.find( addrServ );
		if( pos!=m_ClntProxies.end() )pClntProxy = pos->second;
		else{
			pClntProxy = new CClientProxy( CSessionAddr( GetLocalHostAddr(), 0 ), addrServ );
			m_ClntProxies[addrServ] = pClntProxy;
		}
	}
	//establish the relationship of proxy and session
	pClntProxy->InsertSession( pSession );
	pSession->SetProxy( pClntProxy );

	return pSession;
}
Exemplo n.º 2
0
bool FSocketSubsystemHTML5::GetLocalAdapterAddresses( TArray<TSharedPtr<FInternetAddr> >& OutAdresses )
{
	bool bCanBindAll;
	OutAdresses.Add(GetLocalHostAddr(*GLog, bCanBindAll));
	return true;
}