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

Réseau C Discussion :

Sockets et pthreads


Sujet :

Réseau C

  1. #1
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut Sockets et pthreads
    Salux,

    J'ai une application qui fait un traitement assez long et, en parallele je devrais avoir une partie qui receptionne des "requetes" permettant notamment de savoir où ça en est.
    Il s'avere que je ne puisse peut etre pas utiliser les Fifos alors j'ai pensé aux sockets (domaine Unix).
    Je prefererais eviter aussi les sockets non bloquantes, du coup on se retrouve forcement avec un schema multi-thread, ou multi-process

    J'étais en train de jeter un oeil sur les threads et je ne vois pas vraiment de mecanisme permettant de stopper proprement l'eventuel thread (qui serait bloqué par accept())
    Dans ces cas là, la seule solution serait fork+signal ?

    Mercix

  2. #2
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Une solution consisterait à définir un message de fin. Lorsque le dit thread reçoit ce message, il arrête tout et se termine.

  3. #3
    Membre actif Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Points : 274
    Points
    274
    Par défaut
    Et apres tu te retrouves a faire un serveur concurrent que tu quittes en gérant le signal sigint.
    mais sinon le fameux "quit" quand tu veux quitter!

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gruik
    Salux,

    J'ai une application qui fait un traitement assez long et, en parallele je devrais avoir une partie qui receptionne des "requetes" permettant notamment de savoir où ça en est.
    Il s'avere que je ne puisse peut etre pas utiliser les Fifos alors j'ai pensé aux sockets (domaine Unix).
    Je prefererais eviter aussi les sockets non bloquantes, du coup on se retrouve forcement avec un schema multi-thread, ou multi-process

    J'étais en train de jeter un oeil sur les threads et je ne vois pas vraiment de mecanisme permettant de stopper proprement l'eventuel thread (qui serait bloqué par accept())
    Dans ces cas là, la seule solution serait fork+signal ?

    Mercix

    Attends.. Quel est le problème exact :

    tu voudrais que pendant que ton appli (traitement long) tourne, une partie de cette appli reçoive des requêtes ? ou envoie des statuts ? et les recevoir avec une autre appli ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu veux pouvoir terminer proprement un thread qui ne fait que de l'attente de connexion (type accept()) en boucle, je ne vois pas trente-six solutions propres :
    Pour moi, tu dois ajouter un second socket pour ce thread, et écouter avec select().
    Une tentative de connexion (ou un envoi de données si le socket de contrôle est déjà connecté) sur ce socket et hop! Tu peux quitter ton thread proprement.

    De plus, ce second socket peut être juste un socket local, sans port fixe, connu seulement de ton application : Elle peut se connecter dessus en interne, par exemple en cas de réception d'un ordre d'arrêt sur un autre socket.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Citation Envoyé par stephl
    Une solution consisterait à définir un message de fin. Lorsque le dit thread reçoit ce message, il arrête tout et se termine.
    Oui mais le "thread" serait bloqué par une fonction bloquante

    Attends.. Quel est le problème exact :

    tu voudrais que pendant que ton appli (traitement long) tourne, une partie de cette appli reçoive des requêtes ?
    c'est bien ça
    ou envoie des statuts ? et les recevoir avec une autre appli ?
    bein elle recevrait des requetes en renverrait une reponse

    Si tu veux pouvoir terminer proprement un thread qui ne fait que de l'attente de connexion (type accept()) en boucle, je ne vois pas trente-six solutions propres :
    Pour moi, tu dois ajouter un second socket pour ce thread, et écouter avec select().
    Une tentative de connexion (ou un envoi de données si le socket de contrôle est déjà connecté) sur ce socket et hop! Tu peux quitter ton thread proprement.

    De plus, ce second socket peut être juste un socket local, sans port fixe, connu seulement de ton application : Elle peut se connecter dessus en interne, par exemple en cas de réception d'un ordre d'arrêt sur un autre socket.
    D'accord merci
    C'est vrai j'avais deja entendu parlé de select, je vais me renseigner dessus

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    OK alors pas besoin de multithread, mais (si elle doit ET recevoir ET émettre) effectivement 2 sockets. Socket de réception en asynchrone.

    Et en plus (j'ai fait ça dans des serveurs de données), si tu veux juste dire que le traitement est pas fini, un timer qui déclenche l'écriture de "Working..", ou bien directement un appel à une fonction qui va écrire "Working on xxxx".

    En fait, c'est une structure de base client serveur, avec reception des 2 côtés en asynchrone.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Et sinon, j'ai une autre idée (bête...) mais :

    si c'est juste pour savoir un truc comme ça, pourquoi simplement ne pas mettre un timer dans l'aplli "surveillante", et toutes les X secondes aller vérifier un fichier où simplement tu écrirais "Je travaille sur ...." ou "j'ai fini".. ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Gruik
    Oui mais le "thread" serait bloqué par une fonction bloquante
    C'est justement à cela que sert le message de fin. Le thread (#1) en question est à l'écoute (listen()) et accepte les connexions. Lorsque l'on souhaite arrêter ce thread (qui bloque sur un accept() s'il n'y a plus de message), le thread #2 qui aura été lancé au préalable, envoie sur le port écouté par le thread #1 le message de fin. Ainsi, le thread #1 se débloque (accept() retourne), reconnaît le message de fin, ferme sa socket et se termine.

  10. #10
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Citation Envoyé par souviron34
    OK alors pas besoin de multithread, mais (si elle doit ET recevoir ET émettre) effectivement 2 sockets. Socket de réception en asynchrone.

    Et en plus (j'ai fait ça dans des serveurs de données), si tu veux juste dire que le traitement est pas fini, un timer qui déclenche l'écriture de "Working..", ou bien directement un appel à une fonction qui va écrire "Working on xxxx".

    En fait, c'est une structure de base client serveur, avec reception des 2 côtés en asynchrone.
    Bein les sockets sont deja bidirectionnelles

    Et sinon, j'ai une autre idée (bête...) mais :

    si c'est juste pour savoir un truc comme ça, pourquoi simplement ne pas mettre un timer dans l'aplli "surveillante", et toutes les X secondes aller vérifier un fichier où simplement tu écrirais "Je travaille sur ...." ou "j'ai fini".. ?
    J'y ai pensé mais ça me semblait pas terrible

    C'est justement à cela que sert le message de fin. Le thread (#1) en question est à l'écoute (listen()) et accepte les connexions. Lorsque l'on souhaite arrêter ce thread (qui bloque sur un accept() s'il n'y a plus de message), le thread #2 qui aura été lancé au préalable, envoie sur le port écouté par le thread #1 le message de fin. Ainsi, le thread #1 se débloque (accept() retourne), reconnaît le message de fin, ferme sa socket et se termine.
    Ahhh mais c'est bien sur ^^
    Si le thread est bloqué par une attente de connexion, suffit que le thread principal s'y connecte lui meme et envoie un message particulier de terminaison...

    Groovy

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Mais pour reconnaitre le message de fin, il faut que le thread qui fait le accept() fasse un recv() en plus sur le socket qu'il vient d'accepter...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Médinoc
    Mais pour reconnaitre le message de fin, il faut que le thread qui fait le accept() fasse un recv() en plus sur le socket qu'il vient d'accepter...
    Ca tombe sous le sens; je n'ai pas décrit toutes les étapes mais juste la trame générale à suivre.

  13. #13
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Oui, of course qu'il fera un recv juste apres

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Mais si le client n'envoit rien, le thread du accept() restera bloqué sur le recv() et ne pourra plus rien accepter d'autre.

    Sauf bien sûr en utilisant select()...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Avec select(), on peut choisir de mettre toute la communication réseau dans le même thread, et par exemple lancer les opérations longues dans des threads à part (ou UN thread (ou encore un pool de threads) avec une file d'attente)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Effectivement :/
    Enfin ça complique qd meme pas mal, avoir 2 connexions
    Mais ya pas le choix

  17. #17
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Au fait pour le file descriptor de communication entre le thread principal et le thread gerant les requetes, ne serait il pas plus simple d'utiliser une pipe?

  18. #18
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gruik
    Bein les sockets sont deja bidirectionnelles
    OUI mais tu peux pas être à la fois asynchrone et synchrone. Et pour écrire faut être synchrone.. Et en plus si tu utilises le même, tu sera réveillé chaque fois que tu écris, même en auto ..

    Donc moi quand je fais ça j'en prends 2 : 1 en écoute et un en écriture pour le client et le serveur.


    Citation Envoyé par Gruik
    J'y ai pensé mais ça me semblait pas terrible
    Tout dépend de l'appli. Mais si le but est strictement juste de dire "j'en suis là", pourquoi faire compliqué alors qu'on peut faire simple ??
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  19. #19
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Citation Envoyé par souviron34
    OUI mais tu peux pas être à la fois asynchrone et synchrone. Et pour écrire faut être synchrone.. Et en plus si tu utilises le même, tu sera réveillé chaque fois que tu écris, même en auto ..

    Donc moi quand je fais ça j'en prends 2 : 1 en écoute et un en écriture pour le client et le serveur.
    oki


    Tout dépend de l'appli. Mais si le but est strictement juste de dire "j'en suis là", pourquoi faire compliqué alors qu'on peut faire simple ??
    Non ce n'est pas que ça

  20. #20
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Médinoc
    Mais si le client n'envoit rien, le thread du accept() restera bloqué sur le recv() et ne pourra plus rien accepter d'autre.

    Sauf bien sûr en utilisant select()...
    Pas besoin d'utiliser select(). Le thread #2 se connecte sur le port écouté par le thread #1 (thread que l'on souhaite arrêter). Le thread #1 est donc débloqué (accept() retourne). Le thread #1 fait appel à recv() pour recevoir le message de fin envoyé par le thread #2. Ainsi, le thread #1 peut se terminer. Cette solution fonctionne très bien, je l'ai déjà implémentée avec sucès sur un petit projet clients-serveur.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. socket/pthread les numéros ne se suivent pas
    Par spin0us dans le forum Réseau
    Réponses: 5
    Dernier message: 10/08/2010, 23h20
  2. Pthreads et BSD sockets
    Par cyberjoac dans le forum C++
    Réponses: 2
    Dernier message: 17/06/2009, 09h58
  3. Problème socket & pthread
    Par Prayeriz dans le forum Développement
    Réponses: 4
    Dernier message: 26/03/2009, 17h07
  4. socket pthread connexion
    Par cmoibal dans le forum Réseau
    Réponses: 1
    Dernier message: 23/05/2007, 13h12
  5. Réponses: 8
    Dernier message: 18/04/2007, 14h26

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