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

 C Discussion :

How To, Pompe a message et sockets


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut How To, Pompe a message et sockets
    Bonjour,

    Tout d'abord, je voudrais préciser le contexte dans lequel je me trouve. Je ne développe plus en C depuis des années et des années, j'ai perdu beaucoup de repères, et aujourd'hui encore, je pose plus mes questions dans une optique culture générale informatique plutôt qu'a cause d'un besoin réel et pressant (bien que j'aimerai beaucoup me remettre un peu au C, juste pour le plaisir).

    Donc 2 questions (même si la 2e aurait plus eu sa place dans la catégorie réseau) :

    - Comment implémente t-on une pompe a message sous linux ? A l'époque où je faisait du C, c'était sous win et la pompe était déjà implémentée sur les hello world. Google me renvoi systématiquement sur des exemples windows, et si quelqu'un pouvait m'indiquer où trouver des exemples spéciaux linux/gcc, j'apprécierai grandement.

    - Toujours sous linux et dans la continuité de la 1er question, comment implémenter des sockets asynchrones susceptibles d'envoyer des messages à ma pompe à message lorsque des données arrivent ?

    En vous remerciant par avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Il y a beaucoup de réponses à ta question.

    S'il s'agit principalement de gérer l'activité du bureau et de l'interface graphique (clics, déplacements souris, fermeture de fenêtres, etc.), le serveur X-Window et sa bibliothèque gèrent déjà cela de la même façon. Ce sont les « événements », transmis par des structures de type XEvent.

    S'il s'agit de faire cela à un niveau plus général, les IPC de Sys V proposent également un système de files de messages. Voir msgget, par exemple.

    Si tu veux le faire toi-même avec des sockets, tu peux encore, mais si tu veux pouvoir envoyer invariablement un même événement à plusieurs applications simultanément selon des critères prédéfinis, le mieux est encore de faire une sorte de hub, soit une application serveur à laquelle toutes les autres se connectent. Ce n'est pas très difficile à faire mais cela a été réécrit des dizaines de fois. Le daemon central qui se charge aujourd'hui de cela sous les distributions de Linux récentes est DBus.

  3. #3
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    Merci pour cette réponse.

    Mon but était de pouvoir écrire un petit serveur multi client sans l'aide de fork ou de thread, la seule utilité de la pompe étant de gérer toute arrivée de données sur les différents sockets ouvert comme des événements.

    Après avoir consulté les différents tuto de developpez sur les sockets, je me suis rendu compte que la solution pouvait passer tout naturellement par un select(), qui semble agir comme un sémaphore sur les I/O ( http://broux.developpez.com/articles/c/sockets/#L4-1 ), et donc servir à mettre en place une boucle réagissant bien à un événement "données disponibles". Je suppose que je doit pouvoir gérer d'autres événements que l'arrivée de données sur les sockets en créant en plus un nouveau descripteur de fichiers sur lequel je ferait arriver des données provenant d'autres processus...

    Bref, j'ai remis les pieds dans le bain, et c'est reparti pour les bidouilles comme au bon vieux temps :p

    J'en arrive du coup à une nouvelle question, plus lié au compilateur cette fois (gcc). Je viens d'installer mysql++ et toute les dépendances qui vont bien avec. Maintenant, faut que j'arrive à faire comprendre à gcc qu'il faut inclure la librairie mysql++.

    - donc comment on fait pour lier la librairie au projet au moment de la compilation (désolé, je suis un ancien assisté du VC++)

    - pourquoi mon #include <mysql++.h> me retourne une erreur (no such file or directory) alors que le fichier est bien présent dans /usr/local/include/mysql++/ ?

    En vous remerciant pour aide et votre patience.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 478
    Par défaut
    Citation Envoyé par comode Voir le message
    Mon but était de pouvoir écrire un petit serveur multi client sans l'aide de fork ou de thread, la seule utilité de la pompe étant de gérer toute arrivée de données sur les différents sockets ouvert comme des événements.

    Après avoir consulté les différents tuto de developpez sur les sockets, je me suis rendu compte que la solution pouvait passer tout naturellement par un select() [...] Je suppose que je doit pouvoir gérer d'autres événements que l'arrivée de données sur les sockets en créant en plus un nouveau descripteur de fichiers sur lequel je ferait arriver des données provenant d'autres processus...
    Très bonne approche, c'est comme ça qu'il faut faire. Effectivement, select() te permet de te mettre en attente d'un changement sur un descripteur de socket. La création d'autres descripteurs, comme tu le dis, se fait en se mettant à l'écoute d'un de tes sockets et en « acceptant » les connexions entrantes.

    L'exercice idéal est de refaire une sorte de petit serveur IRC. Celui-ci se met à l'écoute de tous les sockets, lit ce qui en provient en mode texte, ligne à ligne, et rebalance chaque ligne lue sur chaque connexion.

    - donc comment on fait pour lier la librairie au projet au moment de la compilation (désolé, je suis un ancien assisté du VC++)
    On utilise l'option « L » minuscule, suivi du nom de la bibliothèque, débarrassé de son préfixe « lib », donc, en l'occurence : « -lmysql++».

    - pourquoi mon #include <mysql++.h> me retourne une erreur (no such file or directory) alors que le fichier est bien présent dans /usr/local/include/mysql++/ ?
    Parce que, par opposition à « /usr/include », « /usr/local/include » ne fait probablement pas partie des répertoires explorés par défaut par gcc. Il faut utiliser l'option « I » (« i ») majuscule pour spécifier un répertoire de fichiers .h supplémentaire : « -I/usr/local/include ».

  5. #5
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    Merci pour ces réponses.

    J'ai bien réussi a lui faire trouver le .h (j'avais définit le chemin du .h en absolue dans le #include avant de voir ta réponse).

    Maintenant, j'ai une énorme quantité d'erreur avec un main() vide. Je suppose qu'il doit encore falloir "lier" des trucs, mais je reviendrais la dessus un peu plus tard, car j'ai encore pas mal de choses plus élémentaires à voir.

    Encore merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JUnit] problem launching JUnit test et pour message "no socket available" .
    Par dyngry dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/02/2010, 11h38
  2. xml messaging and sockets ssl
    Par kass28 dans le forum XML
    Réponses: 0
    Dernier message: 20/10/2007, 15h20
  3. Ouverture de connexion et envoi d'un message par socket
    Par loleske dans le forum C++Builder
    Réponses: 3
    Dernier message: 10/02/2005, 12h52
  4. [Socket] Message different pour 2 execution similaire
    Par Erok dans le forum Entrée/Sortie
    Réponses: 24
    Dernier message: 13/05/2004, 10h49
  5. Sockets + Receptions de messages
    Par raf_gug dans le forum MFC
    Réponses: 14
    Dernier message: 07/11/2003, 10h29

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