begin process at 2012 02 12 17:35:39
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Réseau & Internet

 > 

chat client server


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

chat client server

samedi 10 février 2007 à 20:23:19 | chat client server

electroonn

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<<inet_ntoa(ServerAddr.sin_addr)<<endl;

      server.n_connected=0;
         server.s_socket = socket(AF_INET,SOCK_STREAM,0);            // Ouverture du socket
   int sizeAddr = sizeof(ServerAddr);

   if( bind(server.s_socket,(sockaddr*)&ServerAddr,sizeAddr)==-1){cout<<"erreur bind"<<endl;}   // Association du socket à un point de communication
  
  else cout<<" bind success"<<endl;

  if(listen(server.s_socket, 3)==-1) {cout<<"erreur listen"<<endl;} // met le socket en écoute

 else cout<<"listen success"<<endl;

  
   SOCKET s;           //socket temporaire
   SOCKADDR_IN csin;   // addr temporaire
   int sinsize= sizeof(csin);
 
  while(1){

   if(s=accept(server.s_socket,(SOCKADDR *)&csin,&sinsize)!= INVALID_SOCKET)
   {
    cout<<"\nVient de se connecter: "<<inet_ntoa(csin.sin_addr)<<":"<<ntohs(csin.sin_port)<<endl;
  
 

    int i=server.n_connected;
   cout<<"socket server"<<server.s_socket<<endl;
    if(i < Max_Connection)
    {
    server.s_client[i].c_socket=s;
    server.s_client[i].c_csin=csin;
    server.s_client[i].isConnected=true;
    server.n_connected++;
    server.s_client[i-1].c_h=CreateThread(NULL,0,ReceiverThread,NULL,0,NULL);
    
    
    }
 

    else cout<<"Too many connections. "<<endl;
  
   
    
   }
  
  }
 
 
 
  }

/******************Partie client****************************/

 if(choix=='c' || choix=='C')
 {

  client.c_csin.sin_addr.s_addr = inet_addr("127.0.0.1");
  client.c_csin.sin_family = AF_INET;
  client.c_csin.sin_port = htons(7001);
  client.isConnected = false;
  client.c_socket = socket(AF_INET,SOCK_STREAM,0);

   int cnt=connect(client.c_socket,(SOCKADDR *)&client.c_csin,sizeof(client.c_csin));
  if(cnt<0) cout<<"connect socket error"<<endl;
  else      cout<<"connexion etablie "<<endl;


  

  //thread d'envoie
    char Buffer[100];
   
  while(1)
  {
  
  cin>>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 ? 

jeudi 15 février 2007 à 21:56:42 | Re : chat client server

lacousine

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.





Mieux vaut être blonde et poser des questions que de rester ignorante !!!!
jeudi 15 février 2007 à 23:31:26 | Re : chat client server

electroonn

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
jeudi 15 février 2007 à 23:34:57 | Re : chat client server

lacousine

Réponse acceptée !
Cool



Mieux vaut être blonde et poser des questions que de rester ignorante !!!!


Cette discussion est classée dans : buffer, server, client, socket, cout


Répondre à ce message

Sujets en rapport avec ce message

fermeture de socket [ par darkkinj ] Je me trouve face à un problème de protection pour mon application serveur. Le serveur est sur un thread correspondant à un client en boucle (quasi)in [C.] 2 Problèmes sur le serveur [ par Adict ] bonsoir tout le monde. [^^happy13] alors ça va faire vraiment longtemps que je patine sur mon serveur. J'ai cherché et cherché pour le 2ème problème plantage du serveur [ par Adict ] Bonjour [^^happy13] alors voila j'ai fini un projet mais il y a un problème. Il se compose d'une application client et serveur. Il y a quelque temps Problème de Compilation (avec classes) [ par baptchr55 ] Bonjour à tous... Voilà, j'ai un nouveau problème. J'ai une classe (permettant de créer des Sockets TCP) et lorsque j'essaye de créer un objet Socket problème chat [ par Adict ] salut tout le monde [^^happy17] alors j'ai commencé depuis peu à vouloir créer un "chat" simple. j'utilise donc les sockets qui marchent mais j'ai 2 Un peu d'aide pour un serveur [ par NAVIE ] Bonjour, voilà mon souci: a l'aide de mon compilateur Dev-C++ Version 4.9.8.10 j'ai crée un socket qui sert de serveur. Cependant même si la compilati Etat Socket Linux [ par cybermax62 ] Existe-t-il un moyen de connaître sur un server (socket,C) l'état d'un connection client (socket,C) utilisant le protocole SOCK_STREAM ? Actuellement client & server [ par Stormy ] J'ai codé un serveur simple usant de TCP. Comme client j'utilise NetCat. Or, quand NetCat 'ferme', mon serveur ne détecte pas la clôture de la relatio Client Server -> le faire fonctioner comme un trojan [ par wxccxw ] Salut, enfaite, j'aimerai faire un client -> serveur, je maitrise pas mal les socket, mais je n'ai pas compris a quoi sa sert : recv(); c pour recevo delay client sur server socket linux [ par 0x0syscall ] Bonjour,Voilà, je voudrais savoir comment je dois m'y prendre pour que sur mon serveur si le client ne repond pas au bout de X secondes, le serveur co


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,265 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales