void * canalThread (void *arg) { struct comm *a = arg; struct comm can[2]; struct comm listeClients[MAX_CLI]; commArrayInit (listeClients); switch (a->etat) { case STATE_INIT:; commCpy (&can[0], &a[0]); commInit (&can[1]); can[0].port = rand () % ESPACE_PORT + PLAGE_CANAL; serveur (can, &canalSub, listeClients); break; case STATE_CL_SUP:; // Le client 'me' ouvre un thread (can) // identification dédié à suppléer 'sup'. // On copie le nom du serveur à surveiller. strncpy (can[0].nom, a[1].nom, strlen (a[1].nom)); // On lui ajoute une petite extension pour le // distinguer. strncat (can[0].nom, SUFF_SUP, strlen (SUFF_SUP)); // On prend notre adresse et tire au sort un port. strncpy (can[0].padr, a[0].padr, strlen (a[0].padr)); can[0].port = rand () % ESPACE_PORT + PLAGE_CANAL; // On s'affecte l'etat 'watcher'. can[0].etat = STATE_CH_WAT; // On conserve l'identité du serveur à surveiller. commCpy (&can[1], &a[1]); serveur (can, &canalSub, listeClients); break; default:; printf ("/!\\ Etat invalide ! (canal)\n"); } pthread_exit (NULL); }
void * annuaireThread (void *arg) { (void) arg; struct comm listeCannaux[MAX_CHAN]; commArrayInit (listeCannaux); serveur (&annuaire, &annuaireSub, listeCannaux); pthread_exit (NULL); }
int main (int argc, char *argv []) { int s, sd, r ; struct sockaddr_in6 monadr, sonadr ; socklen_t salong ; int port, val ; char padr [INET6_ADDRSTRLEN] ; switch (argc) { case 1 : port = 9000 ; break ; case 2 : port = atoi (argv [1]) ; break ; default : usage (argv [0]) ; } s = socket (PF_INET6, SOCK_STREAM, 0) ; if (s == -1) raler ("socket") ; val = 0 ; r = setsockopt (s, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof val) ; if (r == -1) raler ("setsockopt") ; memset (&monadr, 0, sizeof monadr) ; monadr.sin6_family = AF_INET6 ; monadr.sin6_port = htons (port) ; monadr.sin6_addr = in6addr_any ; r = bind (s, (struct sockaddr *) &monadr, sizeof monadr) ; if (r == -1) raler ("bind") ; r = listen (s, 5) ; if (r == -1) raler ("listen") ; salong = sizeof sonadr ; sd = accept (s, (struct sockaddr *) &sonadr, &salong) ; if (sd == -1) raler ("accept") ; if (inet_ntop (AF_INET6, &sonadr.sin6_addr, padr, sizeof padr) == NULL) raler ("inet_ntop") ; printf ("Connexion depuis %s\n", padr) ; serveur (sd) ; close (sd) ; close (s) ; exit (0) ; }
void * clientThread (void *arg) { struct comm *m = arg; if (m->etat == STATE_CL_SIM_INIT || m->etat == STATE_CL_SUP_INIT) { // Contact de l'annuaire et ouverture du serveur m->port = rand () % ESPACE_PORT + PLAGE_CLIENT; pthread_mutex_lock (&annuaire.mutex); envoiUDP (m, &annuaire, CODE_AN_ListReq); pthread_mutex_unlock (&annuaire.mutex); serveur (m, &clientSub, NULL); } // Thread d'entree au clavier else if (m->etat == STATE_CL_SIM || m->etat == STATE_CL_SUP) { long r; char entree[MAXLEN]; char msg[MAXLEN]; memset (entree, '\0', sizeof entree); memset (msg, '\0', sizeof msg); while ((r = read (0, entree, MAXLEN)) > 0) { strncpy (msg, CODE_CH_msgCli, SIZE_CODE); strncat (msg, entree, strlen (entree) - 1); pthread_mutex_lock (&moi[1].mutex); envoiUDP (&moi[0], &moi[1], msg); pthread_mutex_unlock (&moi[1].mutex); memset (entree, '\0', sizeof entree); memset (msg, '\0', sizeof msg); } } pthread_exit (NULL); }
int main(int argc, char const *argv[]) { return serveur(); }