Structure serveur multi-client

Structure serveur multi-client - C++ - Programmation

Marsh Posté le 23-07-2005 à 16:04:30    

Bonjour à vous,
 
je programme c++ sous windows avec vc++ 6.0, et je voudrai coder un serveur multi-client qui fonctionnerait avec des threads. Le problème étant que je ne sais pas à quoi peuvent me servir ces différents threads, doivent-ils faire un accept() pour chaque nouveau client, sur une même socket ? J'aimerai qu'on m'éclaircisse svp... (je ne veux pas de bout de code, juste une structure qui m'indiquerait en gros comment construire ce prog)
 
Merci.

Reply

Marsh Posté le 23-07-2005 à 16:04:30   

Reply

Marsh Posté le 24-07-2005 à 00:54:14    

J'ai essayé de coder vite fait, ca donne le code suivant mais il ne marche pas (ca veut pas se connecter) :
 
main.cpp

Code :
  1. #include <winsock2.h>     /* Headers */
  2. #include <windows.h>
  3. #include <iostream>
  4. #include "need.h" 
  5. #pragma comment(lib, "ws2_32.lib" )     // Library used for linkage
  6. using namespace std;
  7. DWORD WINAPI ClientThread(LPVOID);     /* Threads prototypes */
  8. int main(int argc, char *argv[])
  9. {
  10. WSADATA wsaData;
  11.     int i = 0;
  12. WSAStartup(MAKEWORD(2, 0), &wsaData);
  13. if(argc < 3)     // Check arguments list
  14. {
  15.  cerr << "Usage: messenger <port> <password>\n";
  16.  return 0;
  17. }
  18.     if((sockd = socket(AF_INET, SOCK_STREAM, 0)) == SOCK_ERROR)    // Create socket
  19. {
  20.         cerr << "Socket() error:" << GetLastError() << endl;
  21.  return 0;
  22. }
  23. sin.sin_family = AF_INET;     /* Socket adress initiliazation */
  24. sin.sin_port = htons(atoi(argv[2]));
  25. sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
  26.     if((bind(sockd, (SOCKADDR *) &sin, sizeof(sin)) == SOCK_ERROR))     // Bind the socket                 
  27. {
  28.  cerr << "Bind() error:" << GetLastError() << endl;
  29.  return 0;
  30. }
  31.     listen(sockd, MAX_CLIENT);     // Socket is now listening
  32. for(; i < MAX_CLIENT ; i++)
  33. {
  34.         int len = sizeof(csin);
  35.  cout << "Waiting connection...\n";
  36.  if((sock[i] = accept(sockd, (SOCKADDR *) &csin[i], &len) == INVALID_SOCKET ))
  37.  {
  38.             cout << "oijoijoidfsds\n";
  39.  }
  40.  cout << "New connection in main()\n";
  41.  hThread[i] = CreateThread(0, 0, &ClientThread, reinterpret_cast<LPVOID>(i), 0, 0);
  42.     }
  43. return 0;
  44. }
  45. DWORD WINAPI ClientThread(LPVOID param)    /* Recv() client's data */
  46. {
  47. cout << "New connection !\n";
  48. return 0;
  49. }


 
et le header need.h :

Code :
  1. #ifndef _NEED_H     // Conditional complation
  2. #define _NEED_H
  3. #define SOCK_ERROR -1
  4. #define MAX_CLIENT 10
  5. SOCKADDR_IN csin[MAX_CLIENT];
  6. int sock[MAX_CLIENT];
  7. HANDLE hThread[MAX_CLIENT];     // Handles for threads
  8. SOCKADDR_IN sin;
  9. char *password;
  10. int sockd;
  11. #endif


 
Je le lance correctement, mais quand je tente de m'y connecter va TELNET je recois ce mesage :
telnet localhost 121
Connexion à localhost...Impossible d'ouvrir une connexion à l'hôte, sur le port 121: Echec lors de la connexion
 
Ca doit être un truc bête mais je ne vois vraiment pas...
Merci


Message édité par taron_31 le 24-07-2005 à 00:55:37
Reply

Marsh Posté le 24-07-2005 à 01:22:16    

salut     !!
 
le multithreading sert a executer plusieurs actions en meme  
 
temps ce qui veut dire que ça te permettra d'envoyer et de  
 
recevoir des donnees en meme temps :).
 
pour ce qui concerne les fonctions du sockets , il y en  
 
plein de documents sur le NET qui peut les t'expliquer  
 
A++

Reply

Marsh Posté le 24-07-2005 à 01:40:48    

oui je sais ce qu'est le multi-threading ;-)
Ici j'ai juste voulu faire un petit test pour voir si le socket client etat bien associe à un thread (je n'ai rien fait dans ce dernier encore), mais apparement l'erreur se situe lors de la connection au serveur, je ne vois pas du tout ou est l'erreur :s si tu as une petite idee...
En gros, en attendant, mon but est de faire un appel a un thread qui dit "New conection !" lorsqu'un client se connecte a mon serveur...


Message édité par taron_31 le 24-07-2005 à 01:43:11
Reply

Marsh Posté le 24-07-2005 à 01:52:38    

Ha j'ai trouvé comme je disais ; c'est tout con : c'est une erreur au niveau de l'initialisation du port du socket, j'affecte le mauvais argument, vive moi :s
Merci

Reply

Marsh Posté le 24-07-2005 à 04:05:28    

Re, désolé, je ne peux pas envoyer la banniere LOGIN au client qui vient de se connecter :

Code :
  1. #include <winsock2.h> 
  2. #include <windows.h>
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include "need.h" 
  6. #pragma comment(lib, "ws2_32.lib" ) 
  7. using namespace std;
  8. DWORD WINAPI ClientThread(LPVOID);   
  9. DWORD WINAPI CheckThread();
  10. int main(int argc, char *argv[])
  11. {
  12. WSADATA wsaData;
  13.     WSAStartup(MAKEWORD(2, 0), &wsaData);
  14. int i = 0;
  15. if(argc < 2)   
  16. {
  17.  cerr << "Usage: messenger <port>\n";
  18.  return 0;
  19. }
  20.     if((sockd = socket(AF_INET, SOCK_STREAM, 0)) == SOCK_ERROR) 
  21. {
  22.         cerr << "Socket() error:" << GetLastError() << endl;
  23.  return 0;
  24. }
  25. sin.sin_family = AF_INET;   
  26. sin.sin_port = htons(atoi(argv[1]));
  27. sin.sin_addr.s_addr = inet_addr("127.0.0.1" );
  28.     if((bind(sockd, (SOCKADDR *) &sin, sizeof(sin)) == SOCK_ERROR))                 
  29. {
  30.  cerr << "Bind() error: " << GetLastError() << endl;
  31.  return 0;
  32. }
  33.     listen(sockd, MAX_CLIENT);   
  34. for(; i < MAX_CLIENT ; i++)
  35. {
  36.         int len = sizeof(sin);
  37.         system("cls" );
  38.  cout << "Number of client : " << i;
  39.  if((sock[i] = accept(sockd, (SOCKADDR *) &csin[i], &len) == INVALID_SOCKET ))
  40.  {
  41.             cerr << "Accept() error: " << GetLastError();
  42.  }
  43.  hThread[i] = CreateThread(0, 0, &ClientThread, reinterpret_cast<LPVOID>(i), 0, 0);
  44.  if((send(sock[i], LOGIN, 100, 0)) == -1)
  45.  {
  46.   cerr << "Send() error: " << GetLastError() << endl;
  47.  }
  48.     }
  49.    
  50. return 0;
  51. }
  52. DWORD WINAPI ClientThread(LPVOID param)   
  53. {
  54. return 0;
  55. }
  56. DWORD WINAPI CheckThread() 
  57. {
  58. return 0;
  59. }


 
apres je vous fout la paix promis ! :)
Merci beaucoup

Reply

Sujets relatifs:

Leave a Replay

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