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

Langage C++ Discussion :

Socket en multi-write


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 66
    Par défaut Socket en multi-write
    Salut à tous,

    Je me pose une question très simple, mais que je à laquelle je n'ai pas de réponse.

    J'écris une application de type client-serveur. Mon serveur est en multithread et délègue les tâches au pool de thread quand des messages se présentent pour se replacer immédiatement en écoute.

    De ce coté, c'est testé, pas de soucis particuliers.

    Mon problème est du coté client. J'ai plusieurs processus sur un seul client qui veulent tous parler au serveur, et je ne sais pas comment gérer l'accès au socket. Si deux veulent prendre la parole en même temps, ben un des deux se mange une erreur. Il pourrait faire un truc du genre reessayer toutes les secondes, mais je n'aime pas trop cette solution. Si on a vraiment pas de bol, il est possible qu'un processus ne parle jamais.

    A la limite, un peu plus propre, un envoi de signal du processus qui parle quand il a fini de parler pour dire aux processus en attente que la voie est libre, mais ça me semble toujours bancal comme solution.

    Un truc propre serait de faire un processus qui monopolise le socket en écriture et qui fonctionne à l'inverse du client serveur, il lit une mémoire partagée ou un truc du genre et les processus viendraient y coller leurs messages, le processus qui gere le socket les envoie, recupere la réponse et la met aussi dans la mémoire partagée, qui sera lue par le processus qui envoyait le message.

    Je ne trouve pas tellement d'exemple de bonne manière sur le net. On trouve des millions de serveurs mais souvent les applis clientes sont assez délaissées et je n'ai rien trouvé sur l'accès concurrent en écriture au socket.

    Auriez-vous une idée ? Une des solution que j'avance tient-elle la route ?

    Merci et bonne soirée

    Cyril

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je crois que ça n'est tout simplement pas recommandé: Normalement, chaque processus client utilise son propre socket pour parler au serveur.

    Par contre, avec plusieurs threads au sein d'un même processus (et j'insiste sur la terminologie), je conseillerais l'emploi d'un objet de synchronisation comme un mutex.
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 66
    Par défaut
    Aie, ok je vois, pour le mutli-threading c'est ce que je fais, de la mutex pour verrouiller les accès aux ressources.

    Je vais embrayer sur une question un peu plus orientée réseau alors, ma machine sera dans un réseau privé et le service informatique qui gère ce réseau veut bien me router un port de leur IP publique vers ma machine pour qu'elle puisse dialoguer, mais pas plus d'un.

    Comment utiliser une socket pour chaque processus avec un seul port de routé dans les deux sens.

    Sachant que, bien évidemment, le serveur est externe au réseau privé en question donc la seule porte d'entrée est l'IP publique.

    Merci

    Cyril

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par ZeGuizmo Voir le message
    Aie, ok je vois, pour le mutli-threading c'est ce que je fais, de la mutex pour verrouiller les accès aux ressources.

    Je vais embrayer sur une question un peu plus orientée réseau alors, ma machine sera dans un réseau privé et le service informatique qui gère ce réseau veut bien me router un port de leur IP publique vers ma machine pour qu'elle puisse dialoguer, mais pas plus d'un.

    Comment utiliser une socket pour chaque processus avec un seul port de routé dans les deux sens.

    Sachant que, bien évidemment, le serveur est externe au réseau privé en question donc la seule porte d'entrée est l'IP publique.

    Merci

    Cyril
    Salut,
    Un proxy : une com du proxy vers l'extérieur et n comme entre le proxy et les clients internes.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 66
    Par défaut
    Huh

    Je ne comprends pas du tout la réponse de 3DArchi, par contre, je n'ai pas du tout la main sur le réseau (mais alors pas du tout) je peux juste insérer une prise RJ45 dans un trou et demander au SI de me router les ports vers la machine, c'est tout. Donc je pense que ce qui est à base de proxy, je peux m'assoir dessus.

    Je viens de remarquer un truc qui remet complètement en question ma compréhension des sockets (je vais relire de la doc ce soir...). J'ai fait un test d'écriture de plusieurs process en même temps sur le même port et avec des sleeps bien placés je n'ai pas pu constater de 'error port connection', tout marchait très bien.

    Je vais aller relire mes classiques parce que je passe à coté d'un truc là.

    Bonne soirée,

    Cyril

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    L'idée est d'avoir un processus proxy sur ta machine client :
    Tous les processus de ta machine client font leur envoi vers ce processus proxy sur des ports différents.
    Le proxy est le seul à envoyer vers l'extérieur. Il joue le rôle de multiplexer en quelque sorte.

    Sinon tu peux jouer sur le fait que chaque client à un port distinct et donc une socket différente pour communiquer avec le serveur.

Discussions similaires

  1. Socket, faire un write, débloque un read ?
    Par BakaOnigiri dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 04/02/2010, 14h30
  2. Liste chainée, sockets, serveur multi clients.
    Par jbarreau-mainson dans le forum Réseau
    Réponses: 4
    Dernier message: 01/05/2009, 12h15
  3. TOMCAT en PHP - Utiliser sockets en multi-connexions
    Par JB_Lenoir dans le forum Langage
    Réponses: 10
    Dernier message: 23/10/2008, 19h22
  4. [System.Net.Sockets.TcpListener] multi port
    Par clemsouz dans le forum Windows Forms
    Réponses: 11
    Dernier message: 31/10/2007, 09h28
  5. write() dans une socket.. unix
    Par slack dans le forum Réseau
    Réponses: 5
    Dernier message: 18/12/2002, 20h42

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