*** Des idées de correction pour la première partie : ----------------------------------------------------- int main(void) { int s = create_server_socket("8000"); if(s == -1) exit_error("create_server_socket"); while(true) { int sd = accept_connection(s); if(sd == -1) exit_error("accept_connection"); cout << "arrivée d'un nouveau client" << endl; send_str(sd, "HELLO\r\n"); string cmd; recv_line(sd, cmd); strip_line(cmd); if(cmd == "DATE") send_str(sd, my_date() + "\r\n"); if(cmd == "HOUR") send_str(sd, my_hour() + "\r\n"); send_str(sd, "BYE\r\n"); close(sd); } // On ne sortira en fait jamais de la boucle dans cette version... close(s); return EXIT_SUCCESS; } *** Des idées de correction pour la première partie : ----------------------------------------------------- volatile sig_atomic_t quit = 0; void handler_sigint(int signal) { quit = signal; } int main(int argc, char *argv[]) { int s = create_server_socket("8000"); if(s == -1) exit_error("create_server_socket"); struct sigaction sa; if(sigaction(SIGINT, NULL, &sa) == -1) exit_error("sigaction"); sa.sa_handler = handler_sigint; if(sigaction(SIGINT, &sa, NULL) == -1) exit_error("sigaction"); while(true) { if(quit) break; int sd = accept_connection(s); if(quit) break; if(sd == -1) exit_error("accept_connection"); cout << "arrivée d'un nouveau client" << endl; send_str(sd, "HELLO\r\n"); string cmd; recv_line(sd, cmd); if(!quit) { strip_line(cmd); if(cmd == "DATE") send_str(sd, my_date() + "\r\n"); if(cmd == "HOUR") send_str(sd, my_hour() + "\r\n"); } send_str(sd, "BYE\r\n"); close(sd); } cout << "Je ferme la socket d'écoute, et je me termine..." << endl; close(s); return EXIT_SUCCESS; } ** Comment traiter plusieurs clients simultanéments ? ----------------------------------------------------- A l'arrivée de chaque nouveau client, le serveur (processus principal / processus père) doit créer un nouveau fils dont le rôle sera de gérer le traitement de ce client (au travers de la socket de dialogue, retournée par accept_connection() lors de la connexion du client). Une fois son fils créé, le processus principal va se remettre en attente d'une nouvelle connexion sur la socket d'écoute avec accept_connection(). Le père ne doit pas attendre la terminaison de chacun de ses fils (avec un waipid() bloquant) avec de se remettre en attente d'un nouveau client, sans quoi on ne peut pas traiter plusieurs clients simultanéments. Une technique possible est la suivante : à chaque fois qu'un fils se termine, le père reçoit le signal SIGCHLD ; on peut donc mettre en place un gestionnaire pour SIGCHLD, de façon à ce que le père n'appel waitpid() que lorsqu'un de ses fils se termine.