bool server::crearCliente (int clientSocket)
{
	 pthread_mutex_lock(&m_serverInitMutex);
	//m_lastID almacena el indice de la lista Inteligente en el que el cliente fue agregado
	m_lastID = m_listaDeClientes.add(clientSocket);

	//variable de control
	m_successfulPlayerCreation = false;

	if (m_lastID < 0)
	{
		Logger::Instance()->LOG("Server: Cliente rechazado. El servidor no puede aceptar más clientes.", WARN);
		pthread_mutex_unlock(&m_serverInitMutex);
		return false;
	}

	agregarTimeOutTimer(m_lastID);

	//Envia solicitud de datos de coneccion
	ConnectedMessage connectedMsg;
	connectedMsg.requestData = true;
	connectedMsg.connected = false;
	connectedMsg.objectID = m_lastID;
	connectedMsg.textureID = m_lastID;
	//Tamaño de ventana
	connectedMsg.windowWidth = Game::Instance()->getGameWidth();
	connectedMsg.windowHeight = Game::Instance()->getGameHeight();
	sendConnectedMsg(clientSocket, connectedMsg);

	if (!leerBloqueando(m_lastID))
	{
		//No se pudo crear el jugador
		removeTimeOutTimer(m_lastID);
		m_listaDeClientes.removeAt(m_lastID);
		close(clientSocket);
		pthread_mutex_unlock(&m_serverInitMutex);
		return false;
	}

	//Informa resultado del procesamiento de la informacion de coneccion
	connectedMsg.requestData = false;
	connectedMsg.connected = m_successfulPlayerCreation;

	if (!m_successfulPlayerCreation)
	{
		sendConnectedMsg(clientSocket, connectedMsg);
		removeTimeOutTimer(m_lastID);
		m_listaDeClientes.removeAt(m_lastID);
		close(clientSocket);
		pthread_mutex_unlock(&m_serverInitMutex);
		return false;
	}

	aumentarNumeroClientes();

	pthread_create(&m_clientThreads[m_lastID], NULL, &server::mati_method, (void*)this);
	pthread_create(&m_clientResponseThreads[m_lastID], NULL, &server::mati_method3, (void*)this);

	sendConnectedMsg(clientSocket, connectedMsg);

	printf("Se ha conectado un cliente\n");
	std::stringstream ss;
	ss << "Server: Se acepto el cliente: " << inet_ntoa(cli_addr.sin_addr);
	Logger::Instance()->LOG(ss.str(), DEBUG);
	pthread_mutex_unlock(&m_serverInitMutex);

	return true;
}
Beispiel #2
0
bool server::crearCliente (int clientSocket)
{
	pthread_mutex_lock(&m_serverInitMutex);
	//m_lastID almacena el indice de la lista Inteligente en el que el cliente fue agregado
	m_lastID = m_listaDeClientes.add(clientSocket);

	//variable de control
	m_successfulPlayerCreation = false;

	if (m_lastID < 0)
	{
		Logger::Instance()->LOG("Server: Cliente rechazado. El servidor no puede aceptar más clientes.", LogTypeWarn);
		pthread_mutex_unlock(&m_serverInitMutex);
		return false;
	}

	agregarTimeOutTimer(m_lastID);

	//Envia solicitud de datos de coneccion
	ConnectedMessage connectedMsg;
	connectedMsg.requestData = true;
	connectedMsg.connected = false;
	connectedMsg.objectID = m_lastID;
	connectedMsg.textureID = m_lastID;
	//Tamaño de ventana
	connectedMsg.windowWidth = Game::Instance()->getGameWidth();
	connectedMsg.windowHeight = Game::Instance()->getGameHeight();

	//Info de modo de juego
	connectedMsg.teamMode = Game::Instance()->isTeamMode();

	if (connectedMsg.teamMode == true) {
		std::vector<GameTeam> teamList = Game::Instance()->gameTeams();
		std::stringstream teamStringStream;
		std::transform(teamList.begin(),
				teamList.end(),
				std::ostream_iterator<std::string>(teamStringStream, "|"),
				[](const GameTeam &team) {
			return team.gameTeamName + "-" + std::to_string(team.gameTeamID);
		});

		std::string teamsName = teamStringStream.str();
		std::size_t teamsNameLenght = teamsName.copy(connectedMsg.teamsName, 128, 0);
		connectedMsg.teamsName[teamsNameLenght - 1]='\0';
    } else {
        connectedMsg.teamsName[0] = '\0';
    }

	connectedMsg.cantPlayers = MAX_CLIENTES;
	sendConnectedMsg(clientSocket, connectedMsg);

	if (!leerBloqueando(m_lastID))
	{
		//No se pudo crear el jugador
		removeTimeOutTimer(m_lastID);
		m_listaDeClientes.removeAt(m_lastID);
		close(clientSocket);
		pthread_mutex_unlock(&m_serverInitMutex);
		return false;
	}

	//Informa resultado del procesamiento de la informacion de coneccion
	connectedMsg.requestData = false;
	connectedMsg.connected = m_successfulPlayerCreation;

	if (!m_successfulPlayerCreation)
	{
		sendConnectedMsg(clientSocket, connectedMsg);
		removeTimeOutTimer(m_lastID);
		m_listaDeClientes.removeAt(m_lastID);
		close(clientSocket);
		pthread_mutex_unlock(&m_serverInitMutex);
		return false;
	}

	aumentarNumeroClientes();

	pthread_create(&m_clientThreads[m_lastID], NULL, &server::mati_method, (void*)this);
	pthread_create(&m_clientResponseThreads[m_lastID], NULL, &server::mati_method3, (void*)this);

	sendConnectedMsg(clientSocket, connectedMsg);

	printf("Se ha conectado un cliente\n");
	std::stringstream ss;
	ss << "Server: Se acepto el cliente: " << inet_ntoa(cli_addr.sin_addr);
	Logger::Instance()->LOG(ss.str(), LogTypeDebug);
	pthread_mutex_unlock(&m_serverInitMutex);

	return true;
}