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

  FORUM HardWare.fr
  Programmation
  C++

  UNIX, serveur multiconnexion(thread) pour tchat

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

UNIX, serveur multiconnexion(thread) pour tchat

n°1574749
kenshiro22
Posté le 14-06-2007 à 09:58:36  profilanswer
 

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. }

mood
Publicité
Posté le 14-06-2007 à 09:58:36  profilanswer
 

n°1574762
_darkalt3_
Proctopathe
Posté le 14-06-2007 à 10:18:41  profilanswer
 

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
n°1574804
kenshiro22
Posté le 14-06-2007 à 11:26:32  profilanswer
 

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


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

  UNIX, serveur multiconnexion(thread) pour tchat

 

Sujets relatifs
Problème de Thread qui ne fonctionne pas[C#]Accéder à ma listview depuis un thread
module LDAP sous unixprogrammer sous unix
Envoi de donnée du serveur au client par socketBesoin aide migration serveur Access
[C++] Programmation d'un serveur de jeu[RESOLU]comment faire tourner 1 serveur MySQL sur mon PC??
[Java] Thread & Exception[form] Comment choisir un fichier côté serveur ?
Plus de sujets relatifs à : UNIX, serveur multiconnexion(thread) pour tchat


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