Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1516 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2294035
smdu57
Posté le 24-12-2016 à 15:43:13  profilanswer
 

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. }

mood
Publicité
Posté le 24-12-2016 à 15:43:13  profilanswer
 

n°2294787
xilebo
noone
Posté le 13-01-2017 à 16:18:05  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
probleme affichageProblème phase de commande prestahsop
probleme detection Adblock en Javascript+PHP tourne pas rond[Résolu] OpenFileDialog: manipuler des fichiers "ajouter/enregistrer"
Problème PHP (pour GLPI) après MAJ firmware Qnap[C] Algo pour trouver un sens d'incrément
[Résolu] Mettre à jour/ajouter éléments dans un XML en C#coment faire tourner un borland C++ sur windoiws10
C program from dedicated linux server[C#/HTML] Formater un email via HTML
Plus de sujets relatifs à : [C][pthreads] Probleme deconecton serveur client avec socket


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR