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); }
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()); } }
/*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; }