[C][pthreads] Probleme deconecton serveur client avec socket

Probleme deconecton serveur client avec socket [C][pthreads] - C - Programmation

Marsh Posté le 24-12-2016 à 15:43:13    

Bonjour a tous  :hello:  
 
Je suis étudiant en DUT Informatique et je dois rendre un projet a programmer en C et je me heurte a un gros problème  
 
Voila le projet consiste a créer un programme serveur et un programme client qui communiquent entre eux via des sockets pour créer un chat. Le programme concernant la création du serveur et des sockets ainsi que la connexion client est donné par le professeur.
 
Mon problème que j'essaye de résoudre depuis 2 semaines est le suivant : Quand j’exécute le programme client (après avoir exécuter le programme serveur) il s’avère que plus d'une fois sur deux le client se déconnecte et fais bug le serveur. Sachant qu'en cas de succès le chat marche bien. De plus le problème est d'autant plus problématique que je dois pouvoir réussir a connecter plusieurs client en même temps.
 
Tout le code mis en commentaire permet de gérer le pseudo et est fonctionnel dans le programme de plus je ne fournit que le code serveur car je suis presque sur que le problème vient du code serveur  
 
Merci pour votre aide  :)  
 

Code :
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <netinet/ip.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <unistd.h>
  9. #include <time.h>
  10. typedef struct{
  11.   int * newsockfd;
  12. }socketdata;
  13. int compteur;
  14. pthread_mutex_t m1;
  15. void * f_com(void *arg){
  16. socketdata *temp = (socketdata*)arg;
  17. pthread_mutex_lock(&m1);
  18. int id =compteur;
  19. compteur++;
  20. int i;
  21. pthread_mutex_unlock(&m1);
  22. //char pseudo[16];
  23.   printf("Nouveaux Client connecter au numero %d\n",id);
  24.   //read(temp->newsockfd[id],pseudo,sizeof(pseudo));
  25.   //printf("pseudo recus : %s\n",pseudo);
  26.   //char suite[6] = " : ";
  27. while(1){
  28.    char message[100];
  29.   //char msg[122];
  30.   //strcat(msg,pseudo);
  31.   //strcat(msg,suite);
  32.   //read(temp->newsockfd[id],message,sizeof(msg));
  33.   //printf(" message recut %s \n",message);
  34.   //strcat(msg,message);
  35.   //msg[122] = '\0';
  36.   for (i=0;i<compteur;i++){
  37.     if(i != id){
  38.     write(temp->newsockfd[i],message,sizeof(message));
  39.     }
  40.   }
  41.   //printf(" message envoye \n" );
  42.   }
  43. }
  44. int main()
  45. {
  46.   printf("Serveur démarré\n" );
  47.   pthread_t *thread;
  48.   thread = malloc(sizeof(pthread_t) *10);
  49.   socketdata data;
  50.   data.newsockfd= malloc(sizeof(int) * 10);
  51.   /* Déclaration des variables */
  52.   int sockserveur,newsockfd,lg;
  53.   struct sockaddr_in coord_client;
  54.   struct sockaddr_in mes_coord;
  55.   struct tm *m;
  56.   char* pc;
  57.   char msg[100];
  58.   /* Création d'un socket */
  59.   sockserveur=socket(AF_INET, SOCK_STREAM, 0);
  60.   /* Serveur : appel BIND */
  61.   bzero(&mes_coord,sizeof(mes_coord));
  62.   mes_coord.sin_family=AF_INET;
  63.   mes_coord.sin_port=htons(2001);
  64.   mes_coord.sin_addr.s_addr=htonl(INADDR_ANY);
  65. if(bind(sockserveur,(struct sockaddr*)&mes_coord,sizeof(mes_coord))<0){
  66.   printf("Erreur BIND\n" );
  67.   exit(0);
  68. }
  69. /* Serveur : appel LISTEN */
  70. if (listen(sockserveur,5)<0){
  71.   printf("Erreur LISTEN\n" );
  72.   exit(0);
  73. }
  74. /* Serveur : appel ACCEPT */
  75. int i;
  76. for(i=0;i<10;i++){
  77.   lg=sizeof(coord_client);
  78.   data.newsockfd[i]=accept(sockserveur,(struct sockaddr*)&coord_client,&lg);
  79.   pthread_create(&thread[i],NULL,f_com,(void*)&data);
  80. }
  81. for(i=0;i<10;i++){
  82.   pthread_join(thread[i],NULL);
  83.   close(data.newsockfd[i]);
  84. }
  85.   close(sockserveur);
  86. }

Reply

Marsh Posté le 24-12-2016 à 15:43:13   

Reply

Marsh Posté le 13-01-2017 à 16:18:05    

Bonjour :)
 
1) tu compiles ton programme serveur en mode debug
2) tu le lances avec gdb
3) quand ca plante, tu tapes bt, et tu verras ou ton programme a planté
 
 
Sinon :
 - tu fais des malloc sans faire de free
 - ton thread fait un write sur des sockets non initialisés. En effet, ligne 82 le accept est bloquant, donc tes threads font se créer 1 par 1 à  chaque fois qu'un client va se connecter. Ainsi au premier client, seul newsockfd[0] contient un descripteur de fichier valide, les autres ne contiennent rien ( ton buffer n'est pas initialité, ca peut être n'importe quoi ). Du coup, dans la boucle de ton thread, tu parcoures ton tableau newsockfd, et tu fais un write sur toutes les sockets sauf celle correspondant à ton client i. Je te conseille d'initialiser ton tableau à une valeur invalide ( -1 ) et de faire le write que si la valeur de fd est supérieure à 0.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed