/** * void hashMapInfos::addHasher ( string key, string value ) * @param key * @param value */ void hashMapInfos::addHasher ( string key, vector<int> value ) { if ( trouve ( hashValue ( key ) ) ==0 ) { // cerr << "ICI1" <<endl; infosHasher H ( hashValue ( key ),key,value ); // cerr <<" "<< hashValue ( key )<<" "<< key<<" "<<value <<endl; // cerr << "ICI2" <<endl; m_hasher.push_back ( H ); } }
// Fonction qu'execute les threads de gestion de client void *gestionClient(void *argThread) { ArgThread *arg = (ArgThread *)argThread; int sock = arg->socket; Session *session = NULL;// = arg->session; ListeJoueurs *listeJ = NULL;//session->liste; pthread_t tmp; char *nomSession; int nbRead; char buf[TBUF]; char *req; int cpt=0; int decoProprement = 0; Joueur *myJoueur = NULL; /* Joueur du thread courant */ free(arg); while((!decoProprement) && (cpt<TBUF) && (nbRead=read(sock, &buf[cpt++], 1)) > 0) { /* Lecture d'une ligne */ if(buf[cpt-1] != '\n') continue; buf[cpt-1] = '\0'; cpt = 0; printf("[Receive] : %s\n", buf); req = strtok(buf, "/"); switch(hash_protocole(req)) { case 1: /* CONNEX */ pthread_mutex_lock(&mutexAllSession); // Au cas ou une destruction en cours pthread_mutex_lock(&(sessionDeBase->mutex)); session = sessionDeBase; listeJ = session->liste; myJoueur = connex(sock, listeJ); if(myJoueur == NULL) { pthread_mutex_unlock(&(sessionDeBase->mutex)); pthread_mutex_unlock(&mutexAllSession); sprintf(buf, "Erreur/Pseudo deja present/\n"); write(sock, buf, strlen(buf)); break; } indiquerConnexion(session, myJoueur); // Aux autres joueurs de la session pthread_mutex_unlock(&(sessionDeBase->mutex)); pthread_mutex_unlock(&mutexAllSession); break; case 2: /* SORT */ printf("[Deconnexion] '%s'\n", myJoueur->pseudo); sort(listeJ, myJoueur); decoProprement = 1; break; case 3: // SOLUTION // Reflexion ou resolution pthread_mutex_lock(&(session->mutex)); if(session->phase == REFLEXION) { pthread_mutex_unlock(&(session->mutex)); trouve(session, myJoueur); } else if(session->phase == RESOLUTION) { pthread_mutex_unlock(&(session->mutex)); resolution(session, myJoueur); } else { printf("WHAT not reflexion or resolution... bad client...\n"); // Client mal fait } break; case 4: // ENCHERE enchere(session, myJoueur); break; case 6: // CHAT chat(session, myJoueur); break; case 7: // CREERSESSION session = creerSession(arg->listeSession, myJoueur); if(session == NULL) { sprintf(buf, "Erreur/Session deja existante/\n"); write(sock, buf, strlen(buf)); break; } printf("[Creation Session] name = %s, mdp = %s\n", session->nomSession, session->mdp); pthread_create(&tmp, NULL, gestionSession, session); // On lance le thread de gestion session->thread = tmp; listeJ = session->liste; myJoueur = connex(sock, listeJ); indiquerConnexion(session, myJoueur); // Au cas ou une connexion entre temps break; case 8: // CONNEXIONPRIVEE nomSession = strtok(NULL, "/"); char *mdp = strtok(NULL, "/"); printf("[Connexion privee] nomSession = %s, mdp = %s\n", nomSession, mdp); pthread_mutex_lock(&mutexAllSession); ////////////////////////////// session = getSession(arg->listeSession, nomSession); if(session == NULL) { pthread_mutex_unlock(&mutexAllSession); //////////////////////////////// sprintf(buf, "Erreur/Session inexistante/\n"); write(sock, buf, strlen(buf)); break; } if(strcmp(mdp, session->mdp)) { pthread_mutex_unlock(&mutexAllSession); sprintf(buf, "Erreur/Mauvais mot de passe/\n"); write(sock, buf, strlen(buf)); break; } pthread_mutex_lock(&(session->mutex)); ///////////////: listeJ = session->liste; myJoueur = connex(sock, listeJ); if(myJoueur == NULL) { pthread_mutex_unlock(&(session->mutex)); pthread_mutex_unlock(&mutexAllSession); sprintf(buf, "Erreur/Pseudo deja present/\n"); write(sock, buf, strlen(buf)); break; } indiquerConnexion(session, myJoueur); pthread_mutex_unlock(&(session->mutex)); pthread_mutex_unlock(&mutexAllSession); break; default: printf("[Requete inconnue] '%s'\n", req); break; } } if(myJoueur == NULL || myJoueur->pseudo == NULL) { printf("Un truc est null WARNING !!!\n"); return NULL; } if(!decoProprement) { /* Cas ou fermeture socket sans SORT */ printf("[Deconnexion] '%s'\n", myJoueur->pseudo); sort(listeJ, myJoueur); } pthread_mutex_lock(&mutexAllSession); pthread_mutex_lock(&(session->mutex)); if(session->liste->nbJoueur == 0) { // Dernier joueur de la session Faudrait un mutex global pthread_mutex_unlock(&(session->mutex)); printf("[Dernier joueur] destruction de la session '%s'\n", session->nomSession); pthread_cancel(session->thread); // Annuler le thread de gestion de la session if(session != sessionDeBase) suppSessionListe(arg->listeSession, session); // Si pas la public, on la supprime de la liste des session privees // Si sessionDeBase on le reinitialise pour pas devoir attendre la fin du tour lors des prochaines connexions if(session == sessionDeBase) { // Prendre le mutex de sessionDeBase ou je sais pas quoi printf("[Re-init session public]\n"); sessionDeBase = createSession("Session_1", ""); pthread_create(&tmp, NULL, gestionSession, sessionDeBase); sessionDeBase->thread = tmp; } } else { pthread_mutex_unlock(&(session->mutex)); } pthread_mutex_unlock(&mutexAllSession); printf("Quit\n"); return NULL; }