Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1083 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  programme serveur multitâches

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

programme serveur multitâches

n°1388280
vinoromano
saoule
Posté le 15-06-2006 à 16:15:08  profilanswer
 

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

mood
Publicité
Posté le 15-06-2006 à 16:15:08  profilanswer
 

n°1388300
Taz
bisounours-codeur
Posté le 15-06-2006 à 16:35:47  profilanswer
 

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

n°1388301
vinoromano
saoule
Posté le 15-06-2006 à 16:38:01  profilanswer
 

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.

n°1388427
farib
Posté le 15-06-2006 à 20:26:18  profilanswer
 

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

n°1388683
vinoromano
saoule
Posté le 16-06-2006 à 10:09:24  profilanswer
 

et si je veux utiliser des threads?
Merci

n°1388694
_darkalt3_
Proctopathe
Posté le 16-06-2006 à 10:19:49  profilanswer
 

ben ... essaye ?

n°1388788
vinoromano
saoule
Posté le 16-06-2006 à 11:15:47  profilanswer
 

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

n°1388795
_darkalt3_
Proctopathe
Posté le 16-06-2006 à 11:17:28  profilanswer
 

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

n°1389102
vinoromano
saoule
Posté le 16-06-2006 à 15:08:24  profilanswer
 

_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

n°1389116
_darkalt3_
Proctopathe
Posté le 16-06-2006 à 15:17:33  profilanswer
 

à ton avis ca vient d'où ?

mood
Publicité
Posté le 16-06-2006 à 15:17:33  profilanswer
 

n°1389122
vinoromano
saoule
Posté le 16-06-2006 à 15:20:10  profilanswer
 

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

n°1389155
_darkalt3_
Proctopathe
Posté le 16-06-2006 à 15:43:34  profilanswer
 
n°1389214
vinoromano
saoule
Posté le 16-06-2006 à 16:25:09  profilanswer
 

Non pas plus

n°1390271
vinoromano
saoule
Posté le 19-06-2006 à 09:50:56  profilanswer
 


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.
 

n°1390416
_darkalt3_
Proctopathe
Posté le 19-06-2006 à 13:39:53  profilanswer
 

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
n°1390449
vinoromano
saoule
Posté le 19-06-2006 à 14:07:28  profilanswer
 

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

n°1390455
_darkalt3_
Proctopathe
Posté le 19-06-2006 à 14:11:35  profilanswer
 

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
n°1390456
_darkalt3_
Proctopathe
Posté le 19-06-2006 à 14:14:06  profilanswer
 

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
n°1392683
vinoromano
saoule
Posté le 22-06-2006 à 11:31:29  profilanswer
 

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

n°1392710
_darkalt3_
Proctopathe
Posté le 22-06-2006 à 12:03:33  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  programme serveur multitâches

 

Sujets relatifs
Connection a une bdd MS SQL depuis serveur linuxSQL Serveur et "on delete cascade"
[Urgent : Serveur Ftp ]cherche petit programme tout simple pour coder
Status d'un serveurServeur HTTPS Python
[JavaScript] Récupérer une variable serveurChangement de serveur : restaurer une base de données
Ajax qui fonctionne sur serveur local mais pas sur un serveur distantExecuter un programme externe
Plus de sujets relatifs à : programme serveur multitâches


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR