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

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

Marsh Posté le 29-07-2009 à 15:01:46    

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
Reply

Marsh Posté le 29-07-2009 à 15:01:46   

Reply

Marsh Posté le 29-07-2009 à 15:51:07    


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 ?

Reply

Marsh Posté le 29-07-2009 à 16:03:04    

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

Reply

Sujets relatifs:

Leave a Replay

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