UNIX, serveur multiconnexion(thread) pour tchat

UNIX, serveur multiconnexion(thread) pour tchat - C++ - Programmation

Marsh Posté le 14-06-2007 à 09:58:36    

Bonjour, je suis un développeur amateur... j'aurais eu besoin d'aide pour rendre mon code compatible avec le multithread, j'ai essayer de trouver de la doc..... mais je n'y comprends rien, s'il vous plait, quelqu'un pourrait me donner les modification a faire pour parvenir a mes fin??? j'ai mit mon code juste en dessou
Je vous en remerci grandement, et d'avance :p
 

Code :
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <fcntl.h>
  5. #include <netdb.h>
  6. #include <iostream>
  7. #include <string.h>
  8. #include <unistd.h>
  9. using namespace std;
  10. #define TAILLEMAX 256
  11. #define PORT 2708
  12. #define SOCKET_ERROR -1
  13. #define INVALID_SOCKET -1
  14. #define CONNEXION_MAX 3
  15. class connexion
  16. {
  17. private:
  18. struct sockaddr_in serv_ad, client_ad,sin;
  19. int sockd,sockcli,ex;
  20. public:
  21. connexion()
  22. {
  23. sockd=socket(AF_INET,SOCK_STREAM,0);
  24. }
  25. int getException()
  26. {
  27. return ex;
  28. }
  29. void init(int domaine,int type )
  30. {
  31. serv_ad.sin_family = domaine;
  32. serv_ad.sin_addr.s_addr = type;
  33. serv_ad.sin_port = htons(PORT);
  34. }
  35. int c_bind()
  36. {
  37. int res = bind(sockd,(struct sockaddr*)&serv_ad,sizeof(serv_ad));
  38. return res;
  39. }
  40. int c_listen()
  41. {
  42. return listen(sockd,100);
  43. }
  44. unsigned int sizeOfSin()
  45. {
  46. return sizeof(sin);
  47. }
  48. int c_accept(unsigned int size)
  49. {
  50. return (sockcli = accept(sockd,(struct sockaddr*)&sin, &size));
  51. }
  52. int c_read(char machaine[TAILLEMAX])
  53. {
  54. char ch[TAILLEMAX];
  55. int res = (read(sockcli,ch,sizeof(ch)));
  56. strcpy(machaine,ch);
  57. return res;
  58. }
  59. int c_write(char machaine[TAILLEMAX])
  60. {
  61. char envoi[TAILLEMAX];
  62. strcpy(envoi,machaine);
  63. int res = write(sockcli,envoi,sizeof(envoi));
  64. ;
  65. return res;
  66. }
  67. void c_close()
  68. {
  69. close(sockcli);
  70. }
  71. int c_connect()
  72. {
  73. sockcli=sockd;
  74. return (connect(sockd,(struct sockaddr*)&serv_ad,sizeof(serv_ad)));
  75. }
  76. };
  77. int main(int argc, char *argv[]){
  78. connexion serveur;
  79. unsigned int sin_size;
  80. int ecoute,conn_serv;
  81. char ch[TAILLEMAX],taille,ret,recu[TAILLEMAX];
  82. char * quit ="/quit\0";
  83. //ouverture de la socket socket.open
  84. ;
  85. if(serveur.getException() ==-1)
  86. {
  87. printf("Erreur
  88. socket\n" );
  89. return -1;
  90. }
  91. serveur.init(AF_INET,htonl(INADDR_ANY));
  92. if (serveur.c_bind()  == SOCKET_ERROR)
  93. {      // liaison à la socket
  94. printf("Erreur bind \n" );
  95. return -1;
  96. conn_serv = 0;
  97.   do
  98.   {
  99.   cout << "Serveur en ecoute...\n";
  100.   }while((ecoute = serveur.c_listen()) != 0);
  101.   cout << "Tentative de connexion " <<conn_serv+1 << "\n";
  102.   if(ecoute == SOCKET_ERROR)
  103.   {
  104.             cout << "Connexion failed\n";
  105.             return EXIT_FAILURE;
  106.   }
  107.  
  108.   //Accepte la connexion
  109.   // structure destinée à recueillir les renseignements sur l'appelant
  110.   sin_size = serveur.sizeOfSin();
  111.   if(serveur.c_accept(sin_size) == INVALID_SOCKET)
  112.   {
  113.         cout<<"Tentative de connexion Superieur à" <<conn_serv+1<<"\n";
  114.             return EXIT_FAILURE;     
  115.   };
  116.   cout << "Acceptation de connexion\n";
  117.   // connexion et envoi du message au client
  118.   int retour;
  119. cout<<"Connexion etabli\n";
  120. int bcle = 1;
  121. do
  122. {
  123. fflush(stdin);
  124. fflush(stdout);
  125. ret = (serveur.c_read(ch)==-1);
  126.    if(ret ==-1)
  127. {
  128.  cout <<"Receive error\n";
  129.  return EXIT_FAILURE;
  130. }
  131. if(ch[0] == quit[0] && ch[1] == quit[1] && ch[2] == quit[2] && ch[3] == quit[3] && ch[4] == quit[4])
  132. {
  133.  bcle = 0;
  134.  cout << "Deconnexion du client\n";
  135. }
  136. else
  137. {
  138.     cout<<"Client: "<<ch<<"\n";
  139. cout<<"Entrez le mot a envoyer : ";
  140. fgets(recu,TAILLEMAX,stdin);
  141. fflush(stdin);
  142. fflush(stdout);
  143. ret = serveur.c_write(recu);
  144. if(recu[0] == quit[0] && recu[1] == quit[1] && recu[2] == quit[2] && recu[3] == quit[3] && recu[4] == quit[4])
  145. {
  146.  bcle = 0;
  147.  cout<<"Deconnexion\n";
  148. }
  149. else
  150. {
  151.    if (ret == SOCKET_ERROR)
  152.    { 
  153.     cout<<"Erreur envoi \n";
  154.         return EXIT_FAILURE;
  155.    }
  156. ret = -1;
  157. cout<<"------MESSAGE ENVOYEE------\n";
  158. }
  159. }     
  160. }while(bcle);
  161. serveur.c_close();
  162. return 0;
  163. }

Reply

Marsh Posté le 14-06-2007 à 09:58:36   

Reply

Marsh Posté le 14-06-2007 à 10:18:41    

Tu design un serveur dans un objet, sur le "accept" tu instancie un thread avec un nouvel objet serveur encapsulé dans un thread par exemple, l'objet serveur étant paramétré par les information de la nouvelle socket ouverte.


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

Marsh Posté le 14-06-2007 à 11:26:32    

Euh........................ au risque de passer pour un véritable et lamentable boulet... jdois dire que je ne m'y connais vraiment pas...  :/ et j'ai rien comprit :s

Reply

Sujets relatifs:

Leave a Replay

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