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

  FORUM HardWare.fr
  Programmation
  C

  socket pas thread safe sous linux ? si en fait (resolu)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

socket pas thread safe sous linux ? si en fait (resolu)

n°1909923
xilebo
noone
Posté le 29-07-2009 à 15:01:46  profilanswer
 

Bonjour,
 
Je viens de découvrir une petite subtilité sur le comportement de la fonction socket sous linux.
 
J'ai un protocole qui gère n connexions via n thread, et chaque thread gère indépendamment sa connexion.  
 
Le tout premier appel système que fait chaque connexion est :  
 

Code :
  1. m_socket = socket(AF_INET,SOCK_STREAM,0);


 
Je me suis aperçu que lorsque je créée suffisamment de connexion en même temps (au delà de 6 en l'occurence), pour chaque thread, l'appel socket me retourne le même descripteur de fichier (0 très souvent). On voit tout de suite le problème.  
Si je temporise avec des attentes (sur le dernier chiffre de l'adresse IP par exemple pour décaler dans le temps les appels à socket), je n'ai plus ce problème. (Je n'ai pas encore testé avec un mutex)
 
Conclusion : est-ce normal que si j'appelle simultanément la fonction système socket, que celle-ci me renvoie la même valeur ? Je n'ai pas trouvé dans la doc comme quoi il fallait protéger des appels concurrents. Est-ce que je dois protéger également d'autres appels de ce genre (fonction connect par exemple ?).
 
J'ai effectué le même test sous windows (le programme étant multi plateforme), je ne rencontre pas le problème.
 
Merci d'avance :)


Message édité par xilebo le 29-07-2009 à 16:05:47
mood
Publicité
Posté le 29-07-2009 à 15:01:46  profilanswer
 

n°1909953
tpierron
Posté le 29-07-2009 à 15:51:07  profilanswer
 


Heu, je me demande un truc là. Qu'est ce que les appels à la fonction socket() viennent faire là ?
 
Un serveur TCP, multi-threadé, c'est une attente bloquante sur un accept(), fonction qui va te créer une socket quand un client se connectera pour libérer le port principal. C'est cette nouvelle socket que tu transmet à ton thread.
 
Donc, pourquoi les appels à socket() dans tes threads ?

n°1909960
xilebo
noone
Posté le 29-07-2009 à 16:03:04  profilanswer
 

je ne suis pas serveur, je suis client. J'ai n connexions indépendantes (représentée chacune par un thread) vers n appareils en tant que client.
 
Aucun problème sur le process.
 
Par contre mon erreur énorme de débutant, c'est d'avoir oublié UNE initialisation, celle de ma variable contenant mon socket. Sous windows, elle est bien initialisée à INVALID_SOCKET (-1) mais pas sous linux. Ce qui fait qu'elle vaut 0 par défaut sous linux (debug et release, bizarre).  
Or, avant de recréer chaque connexion, j'appelle une fonction qui ferme proprement ma socket en testant si la valeur est invalide. La valeur étant 0, elle n'est pas invalide, et donc close(0) -> creation de socket sur 0, thread suivant : close(0) -> creation de socket sur 0 ... etc ... Au final, seule la derniere socket sur 0 existe, les n - 1 précédentes sont fermées, et stdin aussi accessoirement.
 
Désolé du dérangement  :o  
 
(accessoirement, cette minuscule erreur tourne depuis 2 ans chez 3 ou 4 clients, mais n'est jamais survenue car c'est sur des anciennes versions de machine qui sont plus lentes d'exécution, le probleme ne survenant pas).
 


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

  socket pas thread safe sous linux ? si en fait (resolu)

 

Sujets relatifs
[RESOLU] erreur pendant le chargement un fichier XML[Résolu]Bouton <Précédent> <Suivant> Pagination
[Java] interférences entre OpenDialog et impression de jFrame (résolu)[RESOLU] Problème de requête et mysql_num_rows
[Resolu][CSS] Div l'une à coté de l'autre[VBA Excel] garder la mise en forme dans une textbox [RESOLU]
[JPA/Hibernate] Mapper des Mapsession perdue après un window.location [pas encore résolu :( ]
[RESOLU] [VBS] copier uniquement les lignes filtrées sous Excel Pattern Java | Probleme ecriture dans fichier texte.
Plus de sujets relatifs à : socket pas thread safe sous linux ? si en fait (resolu)


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