IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Discussion :

[Linux] Socket & thread


Sujet :

Développement

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    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!

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    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/
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 27
    Par défaut
    pour faire simple, tu dois faire un thread qui fait que écouter

  4. #4
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/10/2014, 08h20
  2. Programmation réseau : socket et thread
    Par roms712 dans le forum POSIX
    Réponses: 12
    Dernier message: 12/01/2007, 17h27
  3. Sockets TCP/ Threads
    Par guillaume16 dans le forum C++
    Réponses: 3
    Dernier message: 27/07/2006, 23h45
  4. [linux] socket comment savoir si est un client est d
    Par Mascos dans le forum Réseau
    Réponses: 14
    Dernier message: 04/08/2004, 12h05
  5. Sockets et threads...
    Par Kiff dans le forum Réseau/Web
    Réponses: 6
    Dernier message: 27/07/2004, 17h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo