Winsock et Threads (Boost) : Problème

Winsock et Threads (Boost) : Problème - C++ - Programmation

Marsh Posté le 29-10-2004 à 14:21:33    

Salut
 
Je fais un test avec Winsock et Boost pour les threads. Mais j'ai un problème.
 
Le code suivant fonctionne très bien :

Code :
  1. void main(int argc, char *argv[])
  2. {
  3. std::cout << "running....\n";
  4. try
  5. {
  6.  // Create the socket
  7.  ServerSocket server ( 30000 );
  8.  int i = 0;
  9.  boost::thread_group thrds;
  10.  while ( true )
  11.  {
  12.   ServerSocket new_sock;
  13.   server.accept ( new_sock );
  14.   try
  15.   {
  16.    while ( true )
  17.    {
  18.     std::string data;
  19.     s >> data;
  20.     if (data != "" )
  21.     {
  22.      std::cout << "data recieved....\n";
  23.      s << data;
  24.      std::cout << "data sent....\n";
  25.     }
  26.    }
  27.   }
  28.   catch ( SocketException& e)
  29.   {
  30.    [...]
  31.   }
  32.  }
  33. }
  34. catch ( SocketException& e )
  35. {
  36.  [...]
  37. }
  38. }


 
Alors que celui-ci plante:

Code :
  1. void listener(ServerSocket& s)
  2. {
  3. std::cout << "thread started.... \n";
  4. try
  5. {
  6.  while ( true )
  7.  {
  8.   std::string data;
  9.   s >> data;
  10.   if (data != "" )
  11.   {
  12.    std::cout << "data recieved....\n";
  13.    s << data;
  14.    std::cout << "data sent....\n";
  15.   }
  16.  }
  17. }
  18. catch ( SocketException& e)
  19. {
  20.  [...]
  21. }
  22. }
  23. void main(int argc, char *argv[])
  24. {
  25. //cin cout cerr << "After print" << endl;
  26. //Socket *so = new Socket();
  27. std::cout << "running....\n";
  28. try
  29. {
  30.  // Create the socket
  31.  ServerSocket server ( 30000 );
  32.  int i = 0;
  33.  boost::thread_group thrds;
  34.  while ( true )
  35.  {
  36.   ServerSocket new_sock;
  37.   server.accept ( new_sock );
  38.   boost::thread thrd(boost::bind(&listener, new_sock));
  39.   thrd.join();
  40.  }
  41. }
  42. catch ( SocketException& e )
  43. {
  44.  [..]
  45. }
  46. }


 
Socket est un type que j'ai créé.
 
Le thread se créé mais le programme semble incapable de recevoir des données par le réseau.
 
J'ai juste essayé de créé un thread pour faire une opération très simple. Peut-être est-ce un problère de pointeur, j'avoue que les pointeurs restent un peut flous pour moi.
 
Quelqu'un qurait-il une idée du problème ?
 
Merci


Message édité par Imhotep le 29-10-2004 à 14:23:21
Reply

Marsh Posté le 29-10-2004 à 14:21:33   

Reply

Marsh Posté le 29-10-2004 à 14:28:17    

Et ça marche si tu appelles directement
listener(new_sock); en ligne 45 ?
 
De toutes façons, c'est péché de passer des références sur des variables locales à d'autres threads, donc quand tu enlèveras le join, ton code merdera...
 
Et sinon, ça t'affiche quoi exactement ? Le programme se lock ? Il sort tout seul ?
 

Reply

Marsh Posté le 29-10-2004 à 14:42:08    

Lam's a écrit :

Et ça marche si tu appelles directement
listener(new_sock); en ligne 45 ?


Ah, très bonne question.  
Après test, ca marche.
Alors je sais pas d'où ca viens le problème...
 

Citation :

De toutes façons, c'est péché de passer des références sur des variables locales à d'autres threads, donc quand tu enlèveras le join, ton code merdera...
 
Et sinon, ça t'affiche quoi exactement ? Le programme se lock ? Il sort tout seul ?


En fait j'ai un client qui envoie un message, et le serveur lui renvoie simplement. Mais là il me sort une exception me disant qu'il n'a pa pu lire sur le socket. Alors il s'arrète.
 
Parce qu'en fait je veux faire un programme qui fait serveur, mais je ne sais pas du tout quelle architecture je dois donner à mon programme, ni combien de threads utiliser.

Reply

Marsh Posté le 29-10-2004 à 15:15:59    

Je ne connais pas ton code, mais essaye de passer un type socket_id (plutôt qu'une référence ou autres) à la foncton "listener", et dedans, construit ton object Socket à partir du socket_id. Ca devrait nous dire s'il y a des problèmes au niveau de ton code ou si c'est autre chose...


Message édité par Lam's le 29-10-2004 à 15:16:18
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed