URL: https://linuxfr.org/forums/programmation-c--2/posts/serveur-de-tchat Title: Serveur de tchat Authors: bidulemax Date: 2004年09月11日T17:10:47+02:00 Tags: Score: 0 j'ai commencé un serveur de tchat en C, et évidement, comme bcp de débutants (j'éspère ^^) j'ai un problème avec select... j'arrives pas a l'utiliser malgré ce qui était écrit dans le linux mag 41... #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include <sys/select.h> #include <sys/time.h> #include <unistd.h> #define MYPORT 1789 #define NOMBREMAX 20 typedef struct{ char pseudo[20]; } client; int envoi(int a, int b, char *chaine){ int retour; retour=send(a, chaine, strlen(chaine), b); if (retour == -1){ perror("send"); close(a); } return retour; } main(){ char msg[4097]; int len; int sockfd, nombre=0, i, j, k; client tchateur[NOMBREMAX]; struct sockaddr_in my_addr, their_addr; int sin_size; int new_fd[NOMBREMAX]; struct timeval tv; int retval; fd_set rfds; tv.tv_sec=0; tv.tv_usec=200; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ perror("socket"); exit(1); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero), 8); if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1){ perror("bind"); exit(1); } while (1) { //recherche un nouveau pour se connecter if ( listen(sockfd, NOMBREMAX)== -1){ perror("listen"); exit(1); } sin_size = sizeof(struct sockaddr_in); if ((new_fd[nombre] = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1){ perror("accept"); printf("ERREUR...\n"); } printf("nouveau connecté : %s\n", inet_ntoa(their_addr.sin_addr)); envoi(new_fd[nombre], 0, "\n\n\t\tBienvenu sur le serveur de Max\nListe des commandes :\n\tEXIT pour quitter.\n\tLISTE PSEUDO pour avoir la liste des personnes connectés\nPseudo : "); len = read(new_fd[nombre], tchateur[nombre].pseudo, 19); tchateur[nombre].pseudo[19]=0; //finit le pseudo car si il est plus grand que 20 caractères alors il aurait été tronqué... nombre++; //un connecté de plus for (i=0; i<nombre-1; i++) //préviens tt le monde sauf le nouveau { envoi(new_fd[i], 0, "Connexion de :"); envoi(new_fd[i], 0, tchateur[nombre-1].pseudo); } //fin de le recherche de nouveau connecté for (j=0; j<4097; j++){ msg[j]=0; } len = read(new_fd[i], msg, 4096); if ( msg[0]==69 && msg[1]==88 && msg[2]==73 && msg[3]==84 && msg[3]==84 ) { //Si la comende "EXIT" est tapée alors on déconnecte le client et on refraihit la liste close(tchateur[i].new_fd); printf("déconnexion de : %s", tchateur[i].pseudo); for (j=0;j<nombre;j++){ //préviens tt le monde que machin s'est déconnecté if (j!=i){ //i est déconnecté envoi(new_fd[j], 0, "déconnexion de : "); envoi(new_fd[j], 0, tchateur[i].pseudo); } } for (j=i; j<nombre-1; j++){ //refraichit la liste new_fd[j]=new_fd[j+1]; for (k=0;k<20;k++){ tchateur[j].pseudo[k]=tchateur[j+1].pseudo[k]; } } nombre--; } else if(msg[0]==76 && msg[1]==73 && msg[2]==83 && msg[3]==84 && msg[4]==69) { //Si "LISTE" est tapée alors for (j=0;j<nombre;j++){ //on affiche tt les pseudos envoi(new_fd[i], 0, tchateur[j].pseudo); } }else{ for ( j=0; j < nombre; j++) //envoi à tt le monde ce que i dit { if (j != i){ //mais ne l'envoi pas a i envoi(new_fd[j], 0, tchateur[i].pseudo); envoi(new_fd[j], 0, "\t"); envoi(new_fd[j], 0, msg); } } } } } je sais déja que même si la j'arrives a faire qqch, le serveur de bloqueras à chaque nouvelle connecion, si la personne ne mets pas de pseudo, mais c'ets un détail de dèrnière minute, la, je cherches a faire fonctionner select... et je n'ai aps mis select ici, car je ne sais même pas comment faire pour l'utiliser mis a part l'ini des variables et encore pas toutes loin de la, juste leur déclaration...

AltStyle によって変換されたページ (->オリジナル) /