bool GestionnaireSalon::envoyerListeSalons(SocketTcp* socket)
{
	ReponseListeSalons reponse(getNombreSalonDisponible());
	for (unsigned i = 0; i < listeSalon.size(); i++)
	{
		if (listeSalon[i] != NULL && !listeSalon[i]->getEstEnPartie())
		{
			int nombreJoueurs = listeSalon[i]->getNombreJoueur();
			if (nombreJoueurs > 0 && nombreJoueurs < NOMBRE_JOUEUR_MAX)
			{
				reponse.ajouterSalon(listeSalon[i]->getDataEnTete());
			}
		}
	}

	return reponse.envoyerRequete(socket);
}
Example #2
0
void Salon::gestionRequete(unsigned char octetsRecus[], Joueur * joueur)
{
	std::size_t nombreOctetsEnvoye = 0;

	if (octetsRecus[0] == REQUETE_MONSTRE_SELECTIONNE)
	{
		joueur->monstreSuivant();

		ReponseMonstreSelectionne reponse;
		reponse.ajouterIdMonstre(joueur->getIdMonstre());
		gestionErreur(reponse.envoyerRequete(
			joueur->getSocketTcp(), NOMBRE_RENVOI_MAX),
			REQUETE_MONSTRE_SELECTIONNE,
			TAILLE_REPONSE_MONSTRE_SELECTIONNE);
	}
		
	else if (octetsRecus[0] == REQUETE_ETAT_SALON)
	{
		ReponseEtatSalon reponse(getNombreJoueur());
		for (unsigned int i = 0; i < NOMBRE_JOUEUR_MAX; i++)
		{
			if (listeJoueur[i] != NULL)
			{
				reponse.ajouterJoueur(listeJoueur[i]->getDataEnTete());
			}
			if (listeJoueur[i] == joueur)
			{
				reponse.ajouterIndiceClient(i);
			}
		}

		if (joueur == hote)
		{
			reponse.estHote(true);
		}

		gestionErreur(reponse.envoyerRequete(
			joueur->getSocketTcp(), NOMBRE_RENVOI_MAX),
			REQUETE_ETAT_SALON,
			TAILLE_ENTETE_JOUEUR*getNombreJoueur()+2);
	}

	else if (octetsRecus[0] == REQUETE_EQUIPE_SUIVANTE)
	{
		// client : idrequete / idEquipe
		joueur->equipeSuivante();
		
		ReponseEquipeSelectionnee reponse;
		reponse.ajouterIdEquipe(joueur->getEquipe());

		gestionErreur(reponse.envoyerRequete(
			joueur->getSocketTcp(), NOMBRE_RENVOI_MAX),
			REQUETE_EQUIPE_SUIVANTE,
			TAILLE_REPONSE_EQUIPE_SELECTIONNEE);
	}

	else if (octetsRecus[0] == REQUETE_LANCER_PARTIE)
	{
		// client : idRequete
		// renvoi : idrequete / erreur -> a tous les clients
		ReponseLancerPartie reponse;

		if (joueur != hote)
		{

			std::cout << "erreur hote " << std::endl;

			reponse.ajouterFlagErreur(true);

			afficheur->afficher("sa " + std::to_string(numeroSalon), "trch",
				"Joueur[" + std::to_string(joueur->getNumeroJoueur()) + "] : " +
				" a tenté de lancer la partie sans être hôte - " +
				listeJoueur[joueur->getNumeroJoueur()]->getSocketTcp()->getRemoteAddress().toString());

			gestionErreur(reponse.envoyerRequete(joueur->getSocketTcp(), NOMBRE_RENVOI_MAX),
				REQUETE_LANCER_PARTIE,
				TAILLE_REPONSE_LANCER_PARTIE);
		}

		else
		{
			for (unsigned int i = 0; i < NOMBRE_JOUEUR_MAX; i++)
			{
				if (listeJoueur[i] != NULL)
				{
					gestionErreur(reponse.envoyerRequete(listeJoueur[i]->getSocketTcp(), NOMBRE_RENVOI_MAX),
						REQUETE_LANCER_PARTIE,
						TAILLE_REPONSE_LANCER_PARTIE);
				}
			}

			lancerPartie();
			return;
		}
	}

	else if (octetsRecus[0] == REQUETE_QUITTER_SALON)
	{
		ReponseQuitterSalon reponse;
		gestionErreur(reponse.envoyerRequete(joueur->getSocketTcp(), NOMBRE_RENVOI_MAX),
			REQUETE_QUITTER_SALON,
			TAILLE_REPONSE_QUITTER_SALON);
		liberationSocket(joueur->getNumeroJoueur());
	}
}
Example #3
0
/*Cette fonction effectue le travail du processus chef.
 * elle prend en paramètre l'opération à effectuer, et le nom du fichier à lire
 * elle renvoie le résultat de l'opération sur tout le fichier */
float chef(void* fonction, char* nom_fichier){
	
			/// Déclarations des variables ///
	/*fd -> fichier, positions_deb -> pour lire les lignes du fichier, total_lignes -> première ligne du fichier,
	 * nb_thread -> nombre de thread que le processus doit créer*/
	int fd, position_deb, total_lignes, nb_thread;
	float nombre; // retour de la fonction lecture avant conversion en total_lignes
	ATTR* thread; //un thread
	float* fichier; //un tableau contenant toutes les valeurs du fichier
	float* retour; //un tableau qui va contenir tous les retour des différents threads
	int i;
	
			/// Initialisations ///
	fd = open(nom_fichier, O_RDONLY); // ouverture du fichier
	if(fd == -1){
		printf("fichier pas ouvert\n");
	}
	position_deb = 0;
	nombre = lecture_ligne(fd, &position_deb);
	if(nombre == 0 || nombre == -1) exit(EXIT_FAILURE); // si si nombre = -1 alors il n'y à rien à lire, le fichier est vide
														// si nombre = 0 alors il n'y a aucune valeur dans le fichier
	total_lignes = (int) nombre;									
	nb_thread = total_lignes/PLAGE; // calcul du nombre de threads par rapport au nombre d'éléments qu'un thread peut traiter
	if(fmod(total_lignes, PLAGE) != 0) nb_thread++; //vérification qu'il ne reste pas des valeurs à traiter, si oui on rajoute un thread
	fichier = malloc(sizeof(float)*total_lignes);
	retour = malloc(sizeof(float)*nb_thread);
	thread = malloc(sizeof(ATTR)*nb_thread);
	
			/// Remplissage du tableau avec les valeurs contenues dans le fichier ///
	remplissage_tableau(fichier, fd, total_lignes, &position_deb);
	
			/// Initialisation et création des threads ///
	init_creation_threads(thread, fichier, nb_thread, total_lignes, fonction);
	
			/// Obtention des réponses ///
	/* Ici on remplit le tableau retour avec les retour des threads */
	for(i=0; i<nb_thread; i++){
		pthread_join(thread[i].th, NULL);
		retour[i] = thread[i].retour;
	}
	
			/// Recherche de la réponse finale ///
	if(nb_thread == 1){ //s'il n'y a qu'un seul thread, on peut renvoyer tout de suite la réponse
		close(fd);
		free(thread);
		free(fichier);
		free(retour);
		return thread[0].retour;
	}
	
	if(fonction == odd){
		float rep = odd_tab(nb_thread, retour);
		close(fd);
		free(thread);
		free(fichier);
		free(retour);
		return rep;
	}
	
	/* S'il y a plusieurs thread, on créer un dernier thread qui va s'occuper d'effectuer une dernière fois
	 * l'opération demandée mais sur l'ensemble des réponses données par les threads, soit sur le tableau retour */
	float rep; //pour le retour de la fonction reponse 
	rep = reponse(retour, fonction, nb_thread);
	close(fd);
	free(thread);
	free(fichier);
	free(retour);
	
	return rep;
}