Partage
  • Partager sur Facebook
  • Partager sur Twitter

Socket : echange de donnee

ne marche pas sans _sleep !

Sujet résolu
    23 octobre 2008 à 18:33:58

    Bonjour à tous,

    travaillant actuellement sur un petit projet utilisant les sockets afin de transmettre les données entre deux applications, j'ai à un moment dans mon programme une fonction qui :
    - récupère une chaine de chaque client (contenant des infos du client)
    - envoie une chaine a chaque client (cette chaine contient le nombre de client)
    - envoie plusieurs chaine a chaque client dans une boucle (chacune contenant les infos d'un des clients)

    exemple :
    Nombre de client connecte : 3

    reçoit les infos du client 1
    reçoit les infos du client 2
    reçoit les infos du client 3
    envoie "3" au client 1
    envoie "3" au client 2
    envoie "3" au client 3

    envoie les infos du client 1 à client 1
    envoie les infos du client 1 à client 2
    envoie les infos du client 1 à client 3
    envoie les infos du client 2 à client 1
    envoie les infos du client 2 à client 2
    envoie les infos du client 2 à client 3
    envoie les infos du client 3 à client 1
    envoie les infos du client 3 à client 2
    envoie les infos du client 3 à client 3


    Malheureusement, cela "plante" (perte du contrôle du serveur et des clients, problème d'envoi et de réception je suppose).
    Après plusieurs test, j'ai remarquer que si je mettais une pause de plusieurs milli-secondes dans la boucle qui envoi les infos des clients a chacun des clients, tout se déroulait normalement. J'aurais voulut savoir si ce comportement est "normal" ? J'avoue que c'est un peu gênant, car si je met une pause trop petite, cela plante a certain moment, et si je met trop grand, tout ralentit :( .

    Merci d'avance pour vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      23 octobre 2008 à 18:48:56

      Citation : Brugnar

      Malheureusement, cela "plante" (perte du contrôle du serveur et des clients, problème d'envoi et de réception je suppose).
      Après plusieurs test, j'ai remarquer que si je mettais une pause de plusieurs milli-secondes dans la boucle qui envoi les infos des clients a chacun des clients, tout se déroulait normalement. J'aurais voulut savoir si ce comportement est "normal" ? J'avoue que c'est un peu gênant, car si je met une pause trop petite, cela plante a certain moment, et si je met trop grand, tout ralentit :( .


      Il est un principe incontournable en matière de transmission de données. Le débit de l'émetteur doit être inférieur aux capacités de traitement du récepteur (pour peu que ces grandeurs soient comparables...).

      L'idée est donc de réguler les flux, notamment par un mécanisme d'acquittement (ou des pauses dans l'émission). Est-ce prévu ? Dans ce que tu montres, je ne voie que des envois, et jamais d'attente d'acquittements...

      Autre principe de bonne programmation en général, ne pas 'garder la main'. Il faut rendre du temps CPU dès que possible. Attention au boucles qui n'ont pas de suspension (Sleep(), recv(), accept() select(), getchar(), fgets() etc.)

      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        23 octobre 2008 à 19:01:58

        Tout d'abord merci pour ta réponse rapide !


        En effet, je n'ai nullement prévu d'attente d'acquittement, je vais mettre en place ce système (envoie, attente de la confirmation de la réception, envoie suivant...).

        Par la même occasion, je vais essayer de ne faire qu'un envoie a chaque client contenant toute les infos.

        Merci encore pour ton aide qui m'a bien avancer :) .
        • Partager sur Facebook
        • Partager sur Twitter
          23 octobre 2008 à 19:09:50

          Citation : Brugnar

          Tout d'abord merci pour ta réponse rapide !


          En effet, je n'ai nullement prévu d'attente d'acquittement, je vais mettre en place ce système (envoie, attente de la confirmation de la réception, envoie suivant...).

          Par la même occasion, je vais essayer de ne faire qu'un envoie a chaque client contenant toute les infos.

          Merci encore pour ton aide qui m'a bien avancer :) .



          Par contre pour paralléliser les traitements au maximum, tu peux très bien faire :

          emission vers A
          emission vers B
          emission vers C
          
          reception A
          reception B
          reception C

          en supposant que ton serveur dispose bien d'un thread par client.

          (je rappelle qu'un réseau IP comme internet, est multi-tâche, multi-utilisateur et massivement parallelle)

          Inutile d'imposer cette séquence (qui ralentirait le bazar) :
          emission vers A
          reception A
          
          emission vers B
          reception B
          
          emission vers C
          reception C

          • Partager sur Facebook
          • Partager sur Twitter
          Music only !

          Socket : echange de donnee

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown