Partage
  • Partager sur Facebook
  • Partager sur Twitter

Serveur multithread qui marche un coup sur deux

Sujet résolu
Anonyme
    30 mars 2008 à 19:13:15

    Salut à tous
    je suis entrain de programmer un chat avec serveur multi-thread mais cependant je suis confronté à un problème que je n'arrive pas à résoudre.
    Voici mon problème :

    Une fois que mon serveur est en écoute, et qu'il reçoit un client celui-ci est envoyé sur un thread qui écoute les messages qu'il envoit. Cependant il en reçoit une fois sur deux !
    voici le code du thread:

    1. void *Serveur::thfonc2(int id)
    2. {
    3. SOCKET soc;
    4. soc = users[id].soc;
    5. while (recevoir(soc)!="/stop") // dès qu'on reçoit /stop on coupe
    6. {
    7. cout<<recevoir(soc)<<endl; //on affiche ce que le client a envoyé
    8. }
    9. users[id].marche = 0;
    10. cout << "Un client c'est déconnecté de la socket "<<soc<<" de "<<inet_ntoa (m_sin.sin_addr)<<":"<<htons (m_sin.sin_port)<<endl;
    11. }


    enfin je sais vraiment pas d'où le problème peut venir, si vous voulez plus de mon code demander moi.
    • Partager sur Facebook
    • Partager sur Twitter
      30 mars 2008 à 19:17:51

      je sais pas se que fais recevoir(), mais je ferais la boucle ainsi:
      1. for(;;)
      2. {
      3.    std::string Recu = recevoir(soc);
      4.    if(Recu == "/stop") // dès qu'on reçoit /stop on coupe
      5.        break;
      6.    cout<< Recu <<endl; //on affiche ce que le client a envoyé
      7. }
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        30 mars 2008 à 19:24:19

        salut, merci d'avoir été si rapide pour répondre,recevoir retourne ce qu'envoie le client,en string.
        voici le code :

        1. string Serveur::recevoir(SOCKET a)
        2. {
        3.   string message;
        4. char buffer[512];
        5. memset(buffer,0,sizeof(buffer));//Ici, c'est la procédure pour initialiser
        6. if((recv(a, buffer, sizeof(buffer), 0)) != -1)
        7.     {
        8.  message = buffer; //on met le char dans le string
        9.     }
        10. else //si le client c'est déconnecté
        11.     {
        12.     message="/stop";
        13.     }
        14.  delete [] buffer;
        15.  return message;
        16. }



        ha! merci ton code fonctionne bien, Est ce que tu pourrait m'expliquer ?
        • Partager sur Facebook
        • Partager sur Twitter
          30 mars 2008 à 19:32:55

          enfaite ton erreur dans ta boucle c'est que tu appelais deux fois recevoir() mais que tu ne stockais pas son resultat.

          et pour ta fonction recevoir(), quelques remarques:
          1. string Serveur::recevoir(SOCKET a)
          2. {
          3. char buffer[512];
          4. memset(buffer,0,sizeof(buffer));
          5. // tu peux remplacer les deux lignes ci-dessus par
          6. char buffer[512] = {0};
          7. int recu_taille = 0;
          8. if((recu_taille = recv(a, buffer, sizeof(buffer), 0)) != -1)
          9.     {
          10. // il faut faire finir le buffer par un '\0'
          11. buffer[recu_taille] = '\0';
          12.     }
          13. else //si le client c'est déconnecté
          14.     {
          15.     strcpy(buffer, "/stop");
          16.     }
          17.  delete [] buffer; // tu n'alloues jamais rien, donc inutile
          18.  return buffer; // tu peux directement retourner le buffer
          19. }


          edit: j'ai edité mon code qui avais une petite erreur -> http://www.siteduzero.com/forum-83-258033-2332165-serveur-multithread-qui-marche-un-coup-sur-deux.html#r2332165
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            30 mars 2008 à 19:40:09

            Merci beaucoup par l'aide et les conseil :D tout marche bien maintenant.
            Je vais pouvoir continuer à coder
            A+
            • Partager sur Facebook
            • Partager sur Twitter

            Serveur multithread qui marche un coup sur deux

            × 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