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

  FORUM HardWare.fr
  Programmation
  C

  [prog réseaux]serveur multithread et variable globales

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[prog réseaux]serveur multithread et variable globales

n°2059353
chetsam
Posté le 24-02-2011 à 11:58:30  profilanswer
 

Salut à tous,
 
Bonjour,
 
 
j'ai creer un serveur multithread en ecoute infini.A chaque nouvelle connextion il lance un nouveau thread dédié à un utilisateur :thread_user.
Voila la variable globale qui me pose probleme.

Code :
  1. //variable globale
  2. typedef struct info
  3. {
  4.     int socket;
  5.     char IP[15];
  6.     int port;
  7.    
  8.    
  9. } infos;


 
 
Donc en fait quand un utilisateur se connecte .Le serveur récupere son adresse ip et le port .Elle inscrit ces information avec la nouvelle socket creer dans la variable globale info.
Elle envoie le tout au thread nouvellement creer et se met immédiatement en reécoute d'une nouvelle connextion.Le thread récupere en local le contenu de la variable globale.
Le probleme est que si au meme moment un nouveau client se connecte pendant qu'un thread recupere en local les info de la variables,il risque d'y avoir des soucis pour le thread.
Donc comment protéger avec les mutex une variable globales?
Merci
 

Code :
  1. int main()
  2. {
  3. //mise en place socket
  4. //début de la boucle infini  
  5.     while(1)
  6.     {
  7.         evenement("attente d'une nouvelle connextion" );
  8.         /*acceptation des clients et creation d'une nouvelle socket client */
  9.         socket_client=accept(sock,(struct sockaddr *)&adresse_client,&taille);
  10.         /*test d'erreur de la fonction newsock*/
  11.         if(socket_client<0)
  12.         {
  13.             perror("erreur de la fonction accept" );
  14.             return 1;
  15.         }
  16. s
  17.         //acceuil d'un nouveau client
  18.         /*un nouveau utilisateur viens de se connexter .on collecte ses information
  19.          * de connextion :adresse IP,son port,la nouvelle socket(newsock)*/
  20.         infos info_client;
  21.         pthread_mutex_lock(&mutex);
  22.         strcpy(info_client.IP,inet_ntoa (adresse_client.sin_addr));
  23.         info_client.socket=socket_client;
  24.         info_client.port=ntohs(adresse_client.sin_port);
  25.      
  26.      
  27.         /*preparation des thread clients*/
  28.         pthread_mutex_unlock(&mutex);
  29.         pthread_attr_init(&attr);
  30.         pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
  31.         pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);
  32.         /*lancement des thread proprement dit*/
  33.         if(pthread_create(&threadid,&attr,thread_user,(void *)&info_client)==0)
  34.         {
  35.             continue;
  36.         }
  37.         else
  38.         {
  39.             close(socket_client);
  40.         }
  41.     }
  42.   close(sock);
  43.     close(socket_client);
  44.     return 0;
  45. }
  46. //une partie du code de thread_user
  47. void* thread_user (void *info_client)
  48. {
  49.     int id_user;
  50.     char media[20];
  51.    
  52.     infos *infoclient=(infos *)info_client;
  53.  
  54.     /*on inscrit en local les information sur  l'utilisateur
  55.      * son adresse ip,la socket de communication,le port */
  56.     infos info_local;
  57.     info_local.socket=infoclient->socket;
  58.     strcpy(info_local.IP,infoclient->IP);
  59.    
  60.  
  61.     info_local.port=infoclient->port;
  62.     //reste  du code
  63. return NULL;
  64. }


 
 


Message édité par chetsam le 24-02-2011 à 12:01:19
mood
Publicité
Posté le 24-02-2011 à 11:58:30  profilanswer
 

n°2061970
ITM
Avatar peint à la main
Posté le 09-03-2011 à 09:27:22  profilanswer
 

Un simple semaphore devrait suffire non :??:
1- main() lance ton thread et attend (genre sem_wait)
2- thread_user récupère les infos, les copie et ensuite fait un sem_post.


---------------
iteme.free.fr | Mon feedback

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

  [prog réseaux]serveur multithread et variable globales

 

Sujets relatifs
Mettre résultat d'un fichier php externe dans une variableInstallation d'imprimantes réseaux depuis un serveur
[RESOLU]FTP multithread
Extraire les noms des fichiers pour les utiliser en variableProbleme de variable
Un bind( ) dans un prog client en mode TCPRécupérer une variable Javascript avec AJAX
Copier tables MySQL vers un autre serveur 
Plus de sujets relatifs à : [prog réseaux]serveur multithread et variable globales


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