shintany Dreaming forever~ | Bonjour,
Pour un projet scolaire, je dois développer un chat, avec 2 clients et 1 serveur.
J'arrive à connecter les 2 clients au serveur, à communiquer aucun soucis.
Mon problème survient lorsque je veux déconnecter 1 client, j'ai fait en sorte que si 1 client écrit le mot "disconnect", la connexion se coupe.
Seulement, au moment ou la connexion se coupe, la fenêtre du terminal est flood et je n'arrive pas à comprendre d'ou vient le problème.
J'ai un truc du genre sur le terminal :
Vous : disconnect
Vous : Serveur : Extinction du serveur...
Fermeture du processus...Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : client-eduroam779:Programmation sous UNIX shin$ Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : Vous : V
Idem sur l'autre client et au niveau du serveur :
Disconnect detected!
......... Indéfiniment
J'vous file le code :
Client :
Code :
- /*
-
- PROGRAMME CLIENT
-
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #define BUFFER_SIZE 256
- // LISTE DES PROTOTYPES DES FONCTIONS //
- int cree_socket_tcp_ip(char* ip_socket, int port_socket);
- int affiche_adresse_socket(int sock);
- // FIN DE LA LISTE DES PROTOTYPES DES FONCTIONS //
- int cree_socket_tcp_ip(char* ip_socket, int port_socket)
- {
- int sock;
- struct sockaddr_in adresse;
- sock = socket(AF_INET, SOCK_STREAM, 0);
- // On gère les cas d'erreur
- if (sock < 0)
- {
- fprintf(stderr, "Erreur socket\n" );
- return -1;
- }
- memset(&adresse, 0,sizeof(struct sockaddr_in));
- adresse.sin_family = AF_INET;
- adresse.sin_port = htons(port_socket);
- inet_aton(ip_socket, &adresse.sin_addr);
- if(connect(sock, (struct sockaddr*) &adresse, sizeof(struct sockaddr_in)) < 0)
- {
- close(sock);
- fprintf(stderr, "Erreur connexion\n" );
- return -1;
- }
- //printf("%u\n", ntohs(adresse.sin_port));
- //affiche_adresse_socket(sock);
- return sock;
- }
- int affiche_adresse_socket(int sock)
- {
- struct sockaddr_in adr;
- socklen_t longueur = sizeof(struct sockaddr_in);
- if((getpeername(sock, (struct sockaddr*)&adr, &longueur)) < 0)
- {
- fprintf(stderr,"Erreur getsockname in Client.c, affiche_adresse_socket function\n" );
- return -1;
- }
- printf("IP = %s, Port = %u\n", inet_ntoa(adr.sin_addr), ntohs(adr.sin_port));
- return 0;
- }
- int main(int argc, char* argv[]){
- // On contrôle si l'utilisateur a rentré le bon nombre d'arguments
- if(argc != 3)
- {
- fprintf(stderr, "Mauvaise utilisation\n./client ip_adr port\n" );
- exit(-1);
- }
- int sock;
- char bufferR[BUFFER_SIZE];
- char bufferW[BUFFER_SIZE];
- int nb;
- pid_t pid;
- // On crée le socket
- sock = cree_socket_tcp_ip(argv[1], atoi(argv[2]));
- if(sock < 0)
- {
- fprintf(stderr, "Erreur creation socket (Main)\n" );
- exit(-1);
- }
- nb = 3;
- //printf("Connexion reussie à l'adresse : " );
- pid = fork();
- if(pid == -1)
- {
- fprintf(stderr,"Client : Fork error!\n" );
- return -1;
- }
- else if(pid == 0)
- {
- while(1)
- {
- printf("Vous : " );
- fgets(bufferW, BUFFER_SIZE, stdin);
- write(sock, bufferW, BUFFER_SIZE);
- }
- }
- else
- {
- while(nb > 0)
- {
- nb = read(sock, bufferR, BUFFER_SIZE);
- if(strncmp(bufferR, "Extinction du serveur...", 24) == 0){
- printf("\nServeur : %s", bufferR);
- printf("\nFermeture du processus..." );
- fflush(stdin);
- fflush(stdout);
- kill(pid);
- sleep(2);
- exit(1);
- }
- else{
- bufferR[nb - 2] = '\0';
- printf("\nUser : %s", bufferR);
- }
- }
- }
- close(sock);
- }
|
Serveur :
Code :
- /*
-
- PROGRAMME SERVEUR avec N-CLIENTS
-
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <arpa/inet.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <sys/shm.h>
- #include <errno.h>
- #include <string.h>
- #define BUFFER_SIZE 256
- #define NB_CLIENTS 2
- // LISTE DES PROTOTYPES DES FONCTIONS
- int cree_socket_tcp_ip(char* ip_socket, int port_socket);
- int affiche_adresse_socket(int sock);
- void traite_connection(int *list_client);
- void affiche_client(int *list_client);
- void affiche_ip_client(int client_sock);
- // FIN
- int cree_socket_tcp_ip(char* ip_addr, int port)
- {
- int sock;
- struct sockaddr_in serv_addr;
- //On gère les cas d'erreur
- sock = socket(PF_INET, SOCK_STREAM, 0);
- if(sock < 0)
- {
- fprintf(stderr, "Erreur socket (cree_socket_tcp_ip function)\n" );
- return -1;
- }
- memset(&serv_addr, 0, sizeof(struct sockaddr_in));
- serv_addr.sin_family = PF_INET;
- serv_addr.sin_addr.s_addr = INADDR_ANY;
- serv_addr.sin_port = htons(port);
- //On vérifie si le bind c'est bien passé
- if(bind(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0)
- {
- close(sock);
- fprintf(stderr, "Erreur bind (cree_socket_tcp_ip function)\n" );
- return -1;
- }
- return sock;
- }
- int affiche_adresse_socket(int descripteur_sock){
- struct sockaddr_in adresse;
- socklen_t longueur = sizeof(struct sockaddr_in);
- if (getpeername(descripteur_sock, (struct sockaddr*) &adresse, &longueur) < 0) {
- fprintf(stderr, "Erreur getpeername" );
- return -1;
- }
- printf("IP client : %s : %d\n", inet_ntoa(adresse.sin_addr), ntohs(adresse.sin_port));
- return 0;
- }
- void traite_connection(int *list_client)
- {
- struct sockaddr_in adresse;
- socklen_t lg;
- char bufferR[BUFFER_SIZE];
- char bufferW[BUFFER_SIZE];
- int nb = 3;
- pid_t pid;
- lg = sizeof(struct sockaddr_in);
- int i;
- int j;
- affiche_client(list_client);
- for(i = 0; i < NB_CLIENTS; i++){
- if(getpeername(list_client[i], (struct sockaddr*)&adresse, &lg) < 0)
- {
- fprintf(stderr,"Erreur getpeername, Socket : %d", list_client[i]);
- return;
- }
- }
- // On crée autant de fils qu'il y a de clients sur le serveur
- for( i = 0; i < NB_CLIENTS; i++)
- {
- pid = fork();
- if(pid == -1)
- {
- fprintf(stderr, "Erreur fork lors du traitement de la connexion!\n" );
- return;
- }
- else if(pid == 0) // Child processus
- {
- while(nb > 0)
- {
- nb = read(list_client[i], bufferR, BUFFER_SIZE);
- if(strncmp(bufferR, "disconnect", 10) == 0){
- printf("Disconnect detected!\n" );
- strcpy(bufferW, "Extinction du serveur..." );
- fflush(stdin);
- fflush(stdout);
- //affiche_client(list_client);
- for(j = 0; j < NB_CLIENTS; j++){
- //printf("Ecriture du message d'extinction...\n" );
- write(list_client[j], bufferW, BUFFER_SIZE);
- }
- kill(pid);
- }
- else{
- affiche_ip_client(list_client[i]);
- printf(" : %s", bufferR);
- bufferR[nb - 2] = '\0';
- strcpy(bufferW, bufferR);
- for(j = 0; j < NB_CLIENTS; j++)
- {
- if(j != i)
- write(list_client[j], bufferW, BUFFER_SIZE);
- }
- }
- }
- }
- fflush(stdout);
- }
- /*for(i = 0; i < NB_CLIENTS; i++)
- wait();*/
- }
- void affiche_client(int *list_client)
- {
- int i;
- printf("List of client's socket :\n" );
- for (i = 0; i < NB_CLIENTS; i++)
- printf(" %d ", list_client[i]);
- printf("\n" );
- }
- void affiche_ip_client(int client_sock)
- {
- struct sockaddr_in adresse;
- socklen_t longueur = sizeof(struct sockaddr_in);
- if (getpeername(client_sock, (struct sockaddr*) &adresse, &longueur) < 0) {
- fprintf(stderr, "Erreur getpeername" );
- return;
- }
- printf("%s", inet_ntoa(adresse.sin_addr));
- }
- int main(int argc, char* argv[])
- {
- if(argc != 3)
- {
- fprintf(stderr, "Mauvaise utilisation\n./client ip_adr port\n" );
- exit(-1);
- }
- int sock_contact;
- int list_client[NB_CLIENTS];
- struct sockaddr_in client_addr;
- socklen_t client_lg = sizeof(client_addr);
- pid_t pid;
- sock_contact = cree_socket_tcp_ip(argv[1], atoi(argv[2]));
- if(sock_contact < 0)
- {
- fprintf(stderr, "Erreur création socket_contact (Main function)\n" );
- exit(-1);
- }
- //printf("Socket cree : %d\n", sock_contact);
- if(listen(sock_contact, 5) == -1)
- {
- fprintf(stderr, "Server: listen failed!\n" );
- return -1;
- }
- printf("Adresse du serveur : %s : %u\n", argv[1], atoi(argv[2]));
- printf("Waiting for connections...\n" );
- while(1)
- {
- int i;
- for(i = 0; i < NB_CLIENTS; i++)
- {
- list_client[i] = accept(sock_contact, (struct sockaddr *)&client_addr, &client_lg);
- if(list_client[i] < 0)
- {
- fprintf(stderr,"Acceptation failed! for %d\n", i);
- return -1;
- }
- affiche_adresse_socket(list_client[i]);
- }
- pid = fork();
- if(pid == -1)
- {
- fprintf(stderr, "Erreur fork!\n" );
- return -1;
- }
- if(pid == 0) // FIls se charge de traiter la communication entre les clients
- {
- int j = 0;
- close(sock_contact);
- //affiche_client(list_client);
- traite_connection(list_client);
- for(j= 0; j < NB_CLIENTS; j++)
- close(list_client[j]);
- exit(0);
- }
- else // Père close les sockets
- {
- int j = 0;
- for(j = 0; j < NB_CLIENTS; j++)
- close(list_client[j]);
- }
- }
- return 0;
- }
|
Merci beaucoup! |