Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème de lancement de threads

Sujet résolu
    27 novembre 2007 à 20:17:37

    salut,

    j'ai fais un serveur et un client qui sont censé discuter.Dans le serveur j'utilise une boucle qui attent la connection d'un client et à chaque connection il est censé lancer un thread mais ... il le fait pas :p . En fait il lance le tout premier thread mais aucun des suivants.

    Voici le code du serveur :
    1. #include <iostream>
    2. #include <winsock2.h>
    3. #include <windows.h>
    4. #include <string>
    5. #include <vector>
    6. #define NBR_MAX_CLIENT 4
    7. #define TAILLE_MESSAGE 4
    8. using namespace std;
    9. DWORD WINAPI threadsecoute(void* x);
    10. CRITICAL_SECTION Sync;
    11. struct thread_params
    12. {
    13.        SOCKET sock;
    14.        int num;
    15.        char *tableau[NBR_MAX_CLIENT][TAILLE_MESSAGE];
    16.        bool *joueurexiste[NBR_MAX_CLIENT];
    17. };
    18. char associer(int nbr);
    19. int main()
    20. {
    21.     cout << "demarrage du serveur" <<endl;
    22.     WSADATA WSAData;//initialisation du WSAstartup
    23.     WSAStartup(MAKEWORD(2,0), &WSAData);
    24.     cout << "demarrage de WSAstartup" << endl;
    25.     SOCKET sock_ecoute;//creation du socket d ecoute
    26.     SOCKADDR_IN sin_ecoute;
    27.     sock_ecoute = socket(AF_INET, SOCK_STREAM, 0);
    28.     cout << "creation du socket" << endl;
    29.     int port;
    30.     cout << "reception au port : ";
    31.     cin >> port;
    32.     cout << endl;
    33.     // Configuration de la connexion en serveur
    34.     sin_ecoute.sin_addr.s_addr =     htonl(INADDR_ANY);
    35.     sin_ecoute.sin_family =          AF_INET;
    36.     sin_ecoute.sin_port =            htons(port);
    37.     cout << "socket configuree" << endl;
    38.     bind(sock_ecoute, (SOCKADDR *)&sin_ecoute, sizeof(sin_ecoute));//association des infos
    39.     cout << "association des informations au socket" << endl;
    40.     listen(sock_ecoute, 5);//début de l'écoute
    41.     cout << "debut de l'attente des clients" << endl << endl;
    42.     SOCKET sock_mess;
    43.     SOCKADDR_IN sin_mess;//paramétrage
    44.     int poid = sizeof(sin_mess);
    45.     char tableauposition[NBR_MAX_CLIENT][TAILLE_MESSAGE];
    46.     bool joueur[NBR_MAX_CLIENT];
    47.     for(int i = 0;i<NBR_MAX_CLIENT; i++)
    48.     {
    49.             joueur[i] = false;
    50.     }
    51.     thread_params parametre;
    52.     vector<HANDLE> thread;
    53.     thread.resize(NBR_MAX_CLIENT);
    54.     int compteur = 0;
    55.     bool x = true;
    56.     InitializeCriticalSection(&Sync);
    57.     cout << "initialisation de la section critique" << endl;
    58.     while(x)
    59.     {
    60.     sock_mess = accept(sock_ecoute, (SOCKADDR *) &sin_mess, &poid);
    61.     cout << "client accepte" << endl;
    62.     cout << "infos client :" << endl << "socket : " << sock_mess <<endl;
    63.     cout << "adresse : " << inet_ntoa(sin_mess.sin_addr) << endl;
    64.     cout << "port : " << htons(sin_mess.sin_port) << endl << endl;
    65.     //creation des threads
    66.     parametre.sock = sock_mess;
    67.     parametre.num = compteur;
    68.     for(int i = 0; i < NBR_MAX_CLIENT; i++)
    69.     {
    70.             for(int j =0 ; j< TAILLE_MESSAGE; j++)
    71.             {
    72.                     parametre.tableau[i][j] = &tableauposition[i][j];
    73.             }
    74.             parametre.joueurexiste[i] = &joueur[i];
    75.     }
    76.     thread[compteur] = (CreateThread(NULL,0,threadsecoute,&parametre,0,0));
    77.     Sleep(10);
    78.     if(compteur == NBR_MAX_CLIENT)
    79.     {
    80.                x = false;
    81.     }
    82.     compteur++;
    83.     }
    84.     //fin du programme début des libérations
    85.     cout << endl;
    86.     system("PAUSE");
    87.     cout << endl;
    88.     cout << endl << "fermeture du serveur" << endl;
    89.     closesocket(sock_ecoute);
    90.     cout <<"fermeture du socket d ecoute" << endl;
    91.     closesocket(sock_mess);
    92.     cout <<"fermeture du socket de reception" << endl;
    93.     WSACleanup();
    94.     cout << "fermeture de WSA" <<endl;    
    95.     for(int i = 0; i < thread.size(); i++)
    96.     {
    97.     TerminateThread(thread[i],0);
    98.     cout << "thread n" << i + 1 <<" termine" << endl;
    99.     }
    100.     LeaveCriticalSection(&Sync);
    101.     cout << "section critique fermee " <<endl;
    102.     DeleteCriticalSection(&Sync);
    103.     cout << "section critique detruite" <<endl;
    104.     cout << "serveur ferme" <<endl<<endl;
    105.     system("PAUSE");
    106.     return 0;
    107. }
    108. DWORD WINAPI threadsecoute(void* x)
    109. {
    110.       EnterCriticalSection(&Sync);//entré en section critique
    111.       bool continuer = true;
    112.       thread_params params;//structure contenant les informations pour le threads
    113.       if(x!= NULL)
    114.       {
    115.              struct thread_params *param = reinterpret_cast<struct thread_params *>(x);//convertir void* en struct
    116.              params.sock = param->sock;//initialisation de la structure
    117.              params.num = param->num;
    118.              for(int i = 0; i < NBR_MAX_CLIENT; i++)
    119.              {
    120.                      for(int j = 0; j < TAILLE_MESSAGE; j++)
    121.                      {
    122.                              params.tableau[i][j] = param->tableau[i][j];
    123.                      }
    124.                      params.joueurexiste[i] = param->joueurexiste[i];
    125.              }
    126.              for(int i = 0; i < TAILLE_MESSAGE; i++)
    127.              {
    128.                      *params.tableau[params.num][i] = '0';
    129.              }
    130.              cout << endl << "thread n" << params.num + 1<<" cree avec succes" << endl;
    131.              if(params.sock == SOCKET_ERROR)
    132.              {
    133.                             continuer = false;
    134.                             cout << "la creation du socket dans le threads a eu un probleme" << endl;
    135.              }
    136.       }
    137.       else
    138.       {
    139.           cout << "une erreur est survenue" << endl;
    140.           continuer = false;
    141.       }
    142.       cout << endl;
    143.       LeaveCriticalSection(&Sync);
    144.       char message[TAILLE_MESSAGE];//création des deux message
    145.       char messageenvoye[TAILLE_MESSAGE];
    146.       int y =0;
    147.       EnterCriticalSection(&Sync);
    148.       *params.joueurexiste[params.num] = true;//ce thread marche donbc il existe
    149.       while(continuer)//boucle de reception emission
    150.       {
    151.               if(recv(params.sock, message, sizeof(message), 0)!= SOCKET_ERROR)//si on reçoit correctement les messages
    152.               {
    153.                      if(message[0] == 's' && message[1] == 'p')//on regarde si c'est pas un message de fin
    154.                      {
    155.                              send(params.sock, "sp",sizeof("sp"),0); //si c'est un message de fin on en renvoi un même
    156.                              continuer = false;
    157.                      }  
    158.                      EnterCriticalSection(&Sync);
    159.                      for(int i = 0; i < TAILLE_MESSAGE; i++)
    160.                      {
    161.                              *params.tableau[params.num][i] = message[i];//on transmet le messageau programme
    162.                      }
    163.                      LeaveCriticalSection(&Sync);
    164.               }
    165.               else
    166.               {
    167.                    continuer = false;
    168.                    cout << "une erreur est survenue Erreur n" << WSAGetLastError() << endl;
    169.               }
    170.               EnterCriticalSection(&Sync);
    171.               for(int i = 0 ; i< NBR_MAX_CLIENT; i++)//on regarde combien de thread existe (donc nbr joueur)
    172.               {
    173.                       if(*params.joueurexiste[i] == true && i!= params.num)//BUG
    174.                       {
    175.                                   y++;//on incrémente le compteur
    176.                       }
    177.               }
    178.               LeaveCriticalSection(&Sync);
    179.               messageenvoye[0] = associer(y);//on crée un message qui indiquera combien de message vont suivre
    180.               send(params.sock, messageenvoye,sizeof(messageenvoye),0);//on envoie le nombre de futur message
    181.               EnterCriticalSection(&Sync);
    182.               for(int i = 0; i < NBR_MAX_CLIENT; i++)//boucle qui envoie les messages
    183.               {
    184.                       if(i != params.num && *params.joueurexiste[i] == true)
    185.                       {
    186.                               send(params.sock, *params.tableau[i], sizeof(*params.tableau[i]), 0);
    187.                               y--;
    188.                       }
    189.               }
    190.               LeaveCriticalSection(&Sync);
    191.               if(y > 0)//si le compteur n'est pas vide (donc pas tous les message envoyé
    192.               {
    193.                    for(y; y !=0 ; y--)//on fait une boucle pour complèter
    194.                    {
    195.                           send(params.sock, "vide", sizeof("vide"), 0);
    196.                    }
    197.               }
    198.               y = 0 ;//compteur revient à 0
    199.               Sleep(50);//on dort 50 ms
    200.       }//fin de la boucle de reception emission
    201.       EnterCriticalSection(&Sync);//on termine la socket
    202.       shutdown(params.sock, 2);//on termine la socket
    203.       cout << "fin du thread" << endl;
    204.       LeaveCriticalSection(&Sync);
    205. }


    Je suis désolé le code est un peu long mais je préfère tout mettre comme ça pas d'ambiguité (à noter que j'ai enlever une fonction nommée associer())

    merci d'avance à ceux qui auront le courage de me lire et de m'aider

    icare

    • Partager sur Facebook
    • Partager sur Twitter
      28 novembre 2007 à 20:24:49

      je me permets de faire un petit up parce que malgrès mes nombreux essais ça marche toujours pas

      alors si quelqu'un pouvait m'aider
      • Partager sur Facebook
      • Partager sur Twitter
        30 novembre 2007 à 7:25:30

        mets des traces... qu'est-ce que tu veux qu'on fasse avec un code aussi long? fait un petit programme avec des thread qui ne font pratiquement rien et essaye ton démarrage de threads
        • Partager sur Facebook
        • Partager sur Twitter
          3 décembre 2007 à 22:10:51

          est ce que vous pensez que ça peut être du au fait que je ne change pas de socket en chaque threads ? (la socket nommée sock_mess)
          • Partager sur Facebook
          • Partager sur Twitter

          problème de lancement de threads

          × 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