Précédent   Forum du club des développeurs et IT Pro > Systèmes > Réseaux > Développement
Développement Vos questions relatives au développement réseau
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 01/11/2012, 04h19   #1
Array
Nouveau Membre du Club
 
Avatar de Array
 
Inscription : juillet 2007
Messages : 209
Détails du profil
Informations personnelles :
Âge : 21

Informations forums :
Inscription : juillet 2007
Messages : 209
Points : 25
Points : 25
Par défaut [Linux] Socket & thread

Bonjour,

Je crée en ce moment un serveur basé sur select() pour la gestion des sockets.
Je me demaindais... comment est-ce possible de séparer en plusieurs threads (2-3 peu importe) les connections pour un même port?

Je voudrais pouvoir diviser les nouvelles connections afin de pourvoir les accepter plus rapidement.


Est-ce que je dois faire (ex pour 2 threads) 2 appels à bind() différents pour la même addresse, ou un même bind() et 1 appeal à accept() pour chaque thread? Ou encore 1 appeal à select() à l'intérieur de chaque thread?

Quelqu'un a une idée?

Je ne sais pas trop comment m'y prendre. Je suis relativement débutant sur le plan des sockets. Merci!
Array est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2012, 08h46   #2
gangsoleil
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 7 168
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : R&D en systemes informatiques bas niveau Unix/Linux

Informations forums :
Inscription : mai 2004
Messages : 7 168
Points : 17 962
Points : 17 962
Bonjour,

Le guide le plus complet sur la programmation sockets est probablement le guide de BEEJ (beej guide dans un moteur de recherche).
Tu trouveras des tutos ici aussi : http://reseau.developpez.com/cours/
__________________
Modérateur "C", "Informatique Générale & Hardware" et "Unix"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2012, 09h30   #3
bonnotguillaume
Nouveau Membre du Club
 
Homme Guillaume Bonnot
Ingénieur développement logiciels
Inscription : janvier 2012
Messages : 17
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Bonnot
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Finance

Informations forums :
Inscription : janvier 2012
Messages : 17
Points : 36
Points : 36
pour faire simple, tu dois faire un thread qui fait que écouter
bonnotguillaume est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2012, 22h47   #4
Array
Nouveau Membre du Club
 
Avatar de Array
 
Inscription : juillet 2007
Messages : 209
Détails du profil
Informations personnelles :
Âge : 21

Informations forums :
Inscription : juillet 2007
Messages : 209
Points : 25
Points : 25
Merci à vous deux.
J'ai lu un px le guide de beej sur select(). Je dois dire, très bien fait, très succint. Merci.

Justement, de ce que j'ai lu, je crois avoir trouvé la solution mais j'aimerais que vous confirmiez (est-ce la meille chose à faire etc etc.

Pour faire vite j'ai cette boucle qui regarde pour les modifications de sockets
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	for (;;)
	{
		SOCK_BuildFDList();
		timeout.tv_sec = 1;
		timeout.tv_usec = 0;
		
		readsocks = select(highsock+1, &socks, (fd_set *) 0,  (fd_set *) 0, &timeout);
		
		if (readsocks < 0) {
			perror("select");
			exit(EXIT_FAILURE);
		}
		else if (!readsocks)
		{
			printf(".");
			fflush(stdout);
		}
		else
			read_socks();
	}
SOCK_BuildFDList() se charge simplement, après l'appel à select() qui a altéré la structure fd_set "socks", de refaire la la structure (réinitialiser).

Maintenant, je crois savoir comment répartir le travail sur plusieurs threads.
Dites moi si c'est correct.

Un thread pour faire le listen() [en passant, aucune possibilité d'avoir plusieurs threads pour faire différents listen() sur *même port*?], suivi d'un appel à select().
Pour chaque nouveau socket dans le fd_set "socks" (qui est modifié après avoir appelé select())... puisque select() retourne les sockets ayant été modifiés, passer de façon équitable les différents sockets dans le fd_set à chaque threads (par example s'il y a 6 sockets ayant changé, et qu'on a 2 threads, j'en passe 3 à chaque thread). Comme l'opération est asynchonisée, lorsqu'un thread a fini avant un autre attendre que l'un finisse avec des mutexs. Refaire l'opération et ainsi de suite.

Est-ce que ça a du sens? AUSSI, est-il possible de répartir encore mieux les taches.
Je voulais savoir aussi, pour les nouvelles connections entrantes (ce qui se produit lorsque le fd_set "sock" contient le "listening socket"), est-il mieux d'avoir un thread *exclusif* pour l'acceptation de nouvelles connections?

Merci beaucoup

Array
Array est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h21.


 
 
 
 
Partenaires

Hébergement Web