programme serveur multitâches

programme serveur multitâches - C++ - Programmation

Marsh Posté le 15-06-2006 à 16:15:08    

Bonjour,
Quelqu'un aurait il un programme pour rendre un serveur multitâches?
Merci

Reply

Marsh Posté le 15-06-2006 à 16:15:08   

Reply

Marsh Posté le 15-06-2006 à 16:35:47    

cette phrase ne veut rien dire, c'est normal, c'est la ...

Reply

Marsh Posté le 15-06-2006 à 16:38:01    

Voici ce que je voudrais que le programme fasse par exemple:
Boucle infinie
  La connexion est toujours acceptée sur le port X
  On lance un nouveau programme serveur par le biais de fork()
  Si l’on est dans le programme serveur fils (i-e fork() a retourné 0)  
      Alors  
      On ferme le socket qui était en attente de connexion  
      On ouvre la connexion en direction du vrai serveur
      Boucle infinie
   On attend une trame du vrai client
   Si erreur de lecture
              On fait un exit(0) pour terminer.
   On la transmet à l’autre serveur
   Si erreur d’écriture
  On fait un exit(0) pour terminer.

Reply

Marsh Posté le 15-06-2006 à 20:26:18    

bah tu comme tu l'as écrit toi même, tu forkes.... il est ou le probleme ?

Reply

Marsh Posté le 16-06-2006 à 10:09:24    

et si je veux utiliser des threads?
Merci

Reply

Marsh Posté le 16-06-2006 à 10:19:49    

ben ... essaye ?

Reply

Marsh Posté le 16-06-2006 à 11:15:47    

Tu n'as pas de piste à me donner?
Merci

Reply

Marsh Posté le 16-06-2006 à 11:17:28    

Ben t'as une idée de ton algo ... je vois pas ce qu'il te faut de plus, à part s'y mettre .

Reply

Marsh Posté le 16-06-2006 à 15:08:24    

_darkalt3_ a écrit :

Ben t'as une idée de ton algo ... je vois pas ce qu'il te faut de plus, à part s'y mettre .


 
Voici mon algo et l'erreur à la compilation:
 

Code :
  1. #include "ServerSocket.h"
  2. #include "SocketException.h"
  3. #include <string>
  4. #include <mysql/mysql.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #include <pthread.h>
  9. #include <unistd.h>
  10. #define MYSQL_HOST "localhost"
  11. #define MYSQL_DB "cmm_produits"
  12. #define MYSQL_LOGIN "cmmuser"
  13. #define MYSQL_PASSWD "voltair"
  14. #define mysql_connect(m, h, u, p) mysql_real_connect((m), (h), (u), (p), NULL, 0, NULL, 0)
  15. class GestionServer
  16. {
  17. public:
  18.   MYSQL mysql;  /* Vers la connexion de la base*/
  19.   int StartDataBaseConnection();
  20.   void StopDataBaseConnection();
  21.   //void Tsrv_memoireAdd(char *arg);  
  22.   //void Tsrv_iaxAdd(char *arg);
  23. };
  24. //struct tm {
  25. //  int tm_sec;   /* Secondes */
  26. //  int tm_min;   /* Minutes */
  27. //  int tm_hour;  /* Heures (0 - 23) */
  28. //  int tm_mday;  /* Quantième du mois (1 - 31) */
  29. //  int tm_mon;   /* Mois (0 - 11) */
  30. //  int tm_year;  /* An (année calendaire - 1900) */
  31. //  int tm_wday;  /* Jour de semaine (0 - 6  Dimanche = 0) */
  32. //  int tm_yday;  /* Jour dans l'année (0 - 365) */
  33. //  int tm_isdst; /* 1 si "daylight saving time" */
  34. //};
  35. /* ****************************************************************
  36. * Nom :StartDataBaseConnection                                  *
  37. * But :lancer une connection avec une base de donnée            *
  38. **************************************************************** */
  39. int GestionServer::StartDataBaseConnection()
  40. {
  41.   mysql_init(&mysql);
  42.   /* Se connecter a la base*/
  43.   if (!mysql_connect(&mysql,MYSQL_HOST,MYSQL_LOGIN,MYSQL_PASSWD))
  44.   {
  45.     printf ("Probleme de connection a la BDD\n" );
  46.     return -1;
  47.   }
  48.   if (mysql_select_db(&mysql,MYSQL_DB))
  49.   {
  50.     printf ("Ne peut pas sectionner la BASE\n" );
  51.     mysql_close(&mysql);
  52.     return -1;
  53.   }
  54. return 0;
  55. }
  56. /* ****************************************************************
  57. * Nom :StopDataBaseConnection                                   *
  58. * But : Arreter la connection avec la base de donnée            *
  59. **************************************************************** */
  60. void GestionServer::StopDataBaseConnection()
  61. {
  62.   mysql_close(&mysql);
  63. }
  64. /* ****************************************************************
  65. * Nom :TableTsrv_memoireAdd                         *
  66. * But :Ajouter les donnees dans la Table Tsrv_memoire        *
  67. **************************************************************** */
  68. void* Tsrv_memoireAdd(char *arg, MYSQL mysql)
  69. {
  70.             char *prt;
  71.             char valeur[600],valeur1[40],sqlrequest1[450];
  72.             char val1[20],val2[20], val3[20], val6[20], val5[20],val7[20],val8[20],val9[20],val10[20],val11[20],val13[20],val14[20],mac[20];
  73.             int val12, val4,val22,val32,val52,val62,val72;
  74.             static pthread_mutex_t mutex;
  75.            
  76.            
  77.             prt = strtok(arg, "#" );
  78.             strcpy(mac,prt);
  79.             printf("%s\n",mac);
  80.             prt = strtok(NULL, "#" );
  81.             strcpy(valeur, prt);
  82.             printf("%s\n",valeur);
  83.            
  84.             if (strcmp(valeur,"memoire" )==0)
  85.             {
  86.               prt = strtok(NULL,"#" );
  87.               while (prt!=NULL)
  88.               {
  89.                 pthread_mutex_lock(&mutex);   
  90.                 strcpy(valeur,prt);
  91.                 sscanf(valeur,"%s %s %s %s %s %s", val1,val2,val3,val5,val6,val7);
  92.                 val12 = atoi(val1);
  93.                 val22 = atoi(val2);
  94.                 val32 = atoi(val3);
  95.                 val52 = atoi(val5);
  96.                 val62 = atoi(val6);
  97.                 val72 = atoi(val7);
  98.                 sprintf(sqlrequest1,"INSERT INTO Tsrv_Memoire (Mac,MemTotal,MemLibr,MemActive,MemInactive,SwapLibr,SwapTotal,Heure) VALUES ('%s','%d','%d','%d','%d','%d','%d',now())",mac,val12,val22,val32,val52,val62,val72);
  99.                 mysql_query(&mysql,sqlrequest1);
  100.                 prt = strtok(NULL,"#" );
  101.                
  102.             pthread_mutex_unlock(&mutex);
  103.             sleep(1);
  104.                
  105.               }
  106.               pthread_exit(0);
  107.             }
  108. }
  109. void* Tsrv_iaxAdd(char *arg, MYSQL mysql)
  110. {
  111.    
  112.             char *prt;
  113.             char valeur[600],valeur1[40],sqlrequest1[450];
  114.             char val1[20],val2[20], val3[20], val6[20], val5[20],val7[20],val8[20],val9[20],val10[20],val11[20],val13[20],val14[20],mac[20];
  115.             int val12, val4,val22,val32,val52,val62,val72;
  116.             static pthread_mutex_t mutex;
  117.             pthread_mutex_lock(&mutex);
  118.            
  119.             prt = strtok(arg, "#" );
  120.             strcpy(mac,prt);
  121.             printf("%s\n",mac);
  122.             prt = strtok(NULL, "#" );
  123.             strcpy(valeur, prt);
  124.             printf("%s\n",valeur);
  125.            
  126.                        
  127.             if (strcmp(valeur,"iax" )==0)
  128.             {
  129.               prt = strtok(NULL,"#" );                         
  130.               while (prt!=NULL)
  131.               {
  132.                 pthread_mutex_lock(&mutex);
  133.                 strcpy(valeur,prt);                           
  134.                 sscanf(valeur,"%s %s", val1,val2);
  135.                 sprintf(sqlrequest1,"INSERT INTO Tsrv_TelEtat(ident, Mac, Etat,Heure) VALUES ('%s','%s','%s',now())", val1, mac, val2);
  136.                 mysql_query(&mysql,sqlrequest1);
  137.                 prt = strtok(NULL,"#" );
  138.                 pthread_mutex_unlock(&mutex);
  139.                 sleep(2);
  140.               }
  141.               pthread_exit(0);
  142.             }
  143. }
  144. int main (int argc, char *argv[])
  145. {
  146.        pthread_t thread1, thread2;
  147.        void *retour;
  148.        static pthread_mutex_t mutex;
  149.        pthread_mutex_init (&mutex, NULL);
  150.        MYSQL mysql;
  151.   GestionServer oGestionServer;
  152.   oGestionServer.StartDataBaseConnection();
  153.  
  154.  
  155.   std::cout << "running....\n";   
  156.   try
  157.     {
  158.       /* Create the socket*/
  159.       //int port = 10245;
  160.       int port = 22266;
  161.       ServerSocket server ( port );
  162.       while ( true )
  163.   {
  164.   ServerSocket new_sock;
  165.   server.accept ( new_sock );
  166.   try
  167.     {
  168.       while ( true )
  169.    {
  170.             std::string datast; 
  171.             new_sock >> datast;
  172.             //std::cout << datast << "\n";
  173.            
  174.             size_t size = datast.size() + 1;
  175.             char * data = new char[ size ];
  176.             strncpy( data, datast.c_str(), size );
  177.             //printf("%s\n", data);  
  178.            
  179.             //oGestionServer.Tsrv_iaxAdd(data);   
  180.        if (pthread_create (&thread1, NULL, (void*()(void*)) Tsrv_memoireAdd(data, mysql), NULL) < 0)
  181.        {
  182.            fprintf (stderr, "Impossible de créer le thread 1\\n" );
  183.            exit (1);
  184.        }
  185.      
  186.        if (pthread_create (&thread2, NULL, (void*()(void*)) Tsrv_iaxAdd(data, mysql), NULL) < 0)
  187.        {
  188.            fprintf (stderr, "Impossible de créer le thread 2\\n" );
  189.            exit (1);
  190.        }
  191.      
  192.       (void)pthread_join (thread1, &retour);
  193.       (void)pthread_join (thread2, &retour);
  194.                
  195.                            
  196.            new_sock << "OK";
  197.           }
  198.         }
  199.  catch ( SocketException& ) {} 
  200.   
  201.     }
  202.   }
  203.   catch ( SocketException& e )
  204.       {
  205.         std::cout << "Exception was caught:" << e.description() << "\nExiting.\n";
  206.       }
  207.      
  208.   oGestionServer.StopDataBaseConnection();
  209.  
  210.   return EXIT_SUCCESS;
  211. }
  212. g++    -c -o testthread.o testthread.cpp
  213. testthread.cpp: In function `int main(int, char **)':
  214. testthread.cpp:204: `type name' declared as function returning a function
  215. testthread.cpp:204: casting to function type `int ()()'
  216. testthread.cpp:210: `type name' declared as function returning a function
  217. testthread.cpp:210: casting to function type `int ()()'
  218. make: *** [testthread.o] Error 1

Reply

Marsh Posté le 16-06-2006 à 15:17:33    

à ton avis ca vient d'où ?

Reply

Marsh Posté le 16-06-2006 à 15:17:33   

Reply

Marsh Posté le 16-06-2006 à 15:20:10    

Je crois que c'est au niveau de la création du thread, la déclaration du troisième paramètre. Mais je ne sais que faire

Reply

Marsh Posté le 16-06-2006 à 15:43:34    

Reply

Marsh Posté le 16-06-2006 à 16:25:09    

Non pas plus

Reply

Marsh Posté le 19-06-2006 à 09:50:56    


Salut darkalt3,
Serait-ce ceci?

Code :
  1. pthread_create (&thread1, NULL, (void* (Tsrv_memoireAdd(data, mysql))(void* arg)) , NULL)


Maintenant il me dit des erreurs du type parse error.
Merci de voir avec moi.
 

Reply

Marsh Posté le 19-06-2006 à 13:39:53    

les fonctions que tu fais pointer par ton thread doivent être statics, et avoir un pointeur sur void en paramètre, donc avoir le prototype style
 
static void* mafonctionthreadee(void* iParam);


---------------
Töp of the plöp
Reply

Marsh Posté le 19-06-2006 à 14:07:28    

Mais si je veux que ma fonction soit de ce type:  
int ma_fonction(param1,parm2...)?
Que dois-je faire dans ce cas?
Merci

Reply

Marsh Posté le 19-06-2006 à 14:11:35    

te renseigner, chercher des tutoriels, des exemples, lire de la doc...
 
éventuellement passer des pointeurs sur objet ... en faisant attention ...


Message édité par _darkalt3_ le 19-06-2006 à 14:11:57

---------------
Töp of the plöp
Reply

Marsh Posté le 19-06-2006 à 14:14:06    

j'oublie le plus important: si tu es sous windows, utilises plutot les thread mfc. Les fonctions que tu utilises sont plutôt orientées C, pas C++.


---------------
Töp of the plöp
Reply

Marsh Posté le 22-06-2006 à 11:31:29    

J'ai finalement trouvé la solution,
d'une part, j'ai regroupé mes deux fonctions en une seule fonction à laquelle je passe mon argument en faisant char *argu=(char *)arg, avec arg l'élélment void* arg passé à ma fonction. Ensuite j'ai enlevé la classe.
J'ai aussi supprimé le mutex car il ne me sert à rien dans ce cas.
Merci

Reply

Marsh Posté le 22-06-2006 à 12:03:33    

[résolu] en titre de topic :jap:

Reply

Sujets relatifs:

Leave a Replay

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