Chat client server

Résolu
electroonn Messages postés 49 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 27 novembre 2007 - 10 févr. 2007 à 20:23
cs_lacousine Messages postés 58 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 13 juillet 2007 - 15 févr. 2007 à 23:34
Bonjour,
j'essaye de developper avec c++ une application de chat (client-server) sous windows, en voici le code:

Server server;
 Client client;


void main() {


 
 int nResult;      // Retour des fonctions
 char choix;




 WORD wVersionRequested = WINSOCK_REQ_VERSION;
    WSADATA wsaData;


    nResult = WSAStartup(wVersionRequested, &wsaData);
 
  if (wsaData.wVersion != wVersionRequested) {
        cout<<"\nWinSock version 2.2 requis\n"<<endl;
        return;
     }


  cout<<"Pour le mode serveur taper s"<<endl;
  cout<<"Pour le mode client taper c"<<endl;
  cin>>choix;

/********************Partie serveur***************************/


  if(choix=='s' || choix=='S')   
  {
   
   sockaddr_in  ServerAddr;                      // Adresse locale
  
   int port = PORT;
   ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
   ServerAddr.sin_family = AF_INET;
   ServerAddr.sin_port = htons(7001);
    
  
 cout<>Buffer;
  int rc=send(client.c_socket,Buffer,sizeof(Buffer),0);
  if(rc!=sizeof(Buffer)) cout<<"erreur envoie"<<endl;
  else cout<<"send success"<<endl;
  
  
  }

  //thread de reception
  CreateThread(NULL,0,ReceiveClient,NULL,0,NULL);
  


 }




}

/****************Definition des fonctions******************************/

 DWORD WINAPI ReceiverThread(LPVOID pParam){


 
  char Buffer[1024]="\0";
  int i= server.n_connected-1;
  char msg[]="Bienvenue";
   int rc= send(server.s_client[i].c_socket,msg,sizeof(msg),0);
  if(rc !=sizeof(msg)) cout<<"erreur envoie 1"<<endl;


  cout<<"nbre connect "<<server.n_connected<<endl;
 
 
  do{
    i= server.n_connected-1;
    SOCKET s=server.s_client[i].c_socket;
       recv(s,Buffer,sizeof(Buffer),1);
 
  
   printf("\r%s:%d> %s", inet_ntoa(server.s_client[i].c_csin.sin_addr),
                              ntohs(server.s_client[i].c_csin.sin_port),
                              Buffer);
  


   if(strcmp(Buffer,"quit")==0)
   {
     server.s_client[i].isConnected=false;
    closesocket(server.s_client[i].c_socket);
    server.n_connected--;
   }


   for(int j=0;j<3;j++)
   {
    if(server.s_client[j].isConnected==true && j!=i)
     send(server.s_client[j].c_socket,Buffer,sizeof(Buffer),0);
   
    
   }


  
   memset(Buffer,'\0',1024*sizeof(char));
  }


 while(server.s_client[i].isConnected==true);


 return 0;
 }


 


 DWORD WINAPI ReceiveClient(LPVOID pParam){


 
  char Buffer[1024];


  while(1)
  {
   recv(client.c_socket,Buffer,sizeof(Buffer),0);
  
   cout<<Buffer<<endl;
   memset(Buffer,'\0',1024*sizeof(char));
  
  }
  return 0;
 }

/********** fichier.h**********************/

struct Client {


 HANDLE c_h;
 SOCKET c_socket;
 SOCKADDR_IN c_csin;
 bool isConnected;
};


struct Server {


 HANDLE s_h;
 SOCKET s_socket;
 Client s_client[Max_Connection-1];
 int n_connected;
};

le probleme c'est que le serveur apres avoir accepté la connexion, il arrive pas a communiquer avec les clients, j'ai tjrs des erreurs au niveau de la fonction send. j'ai essayé de faire un cout sur l'id du socket cree par la fonction accept()  et ce qui est bizarre c'est que je trouve tjrs la meme valeur (s=1)  pour tous les clients. est ce que vous aurez une solution ? 

3 réponses

cs_lacousine Messages postés 58 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 13 juillet 2007
15 févr. 2007 à 23:34
Cool

Mieux vaut être blonde et poser des questions que de rester ignorante !!!!
3
cs_lacousine Messages postés 58 Date d'inscription mardi 6 janvier 2004 Statut Membre Dernière intervention 13 juillet 2007
15 févr. 2007 à 21:56
Svp pourrais-tu retapper ton code et faire des classes différentes pour le serveur et le client ?!?!? Je n'aime pas le fait que tout soit dans le main( ), car je trouve ca illisible et difficile à aider à te débugger.

Tu pourrais penser à te faire une classe SocketClient et SocketServeur, ca serait déjà un bon début.

<hr />
Mieux vaut être blonde et poser des questions que de rester ignorante !!!!
0
electroonn Messages postés 49 Date d'inscription mardi 14 février 2006 Statut Membre Dernière intervention 27 novembre 2007
15 févr. 2007 à 23:31
oui effectivement j'ai refait mon code et le probleme etait au niveau de l'affectation de l'id du socket dans la  boucle if suivante:
 if(s=accept(server.s_socket,(SOCKADDR *)&csin,&sinsize)!= INVALID_SOCKET)

il fallait plutot faire :
s=accept(server.s_socket,(SOCKADDR *)&csin,&sinsize);
 if(s!=INVALID_SOCKET)
{
//code
}

merci
0
Rejoignez-nous