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; }
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; }