Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : chat client server [ Windows / Réseau & Internet ] (electroonn)

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é 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 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 Problème client/serveur -> flux du recv avec un air d'extraterrestre [ par thispawn ] Bonjour j'ai codé un système client serveur. Dès que le client arrive a se connecter il envoi avec 3 send ceci : format B ou D | taille du buffer | bu Envoie de données vers un serveur en langage C [ par esmee ] Bonjour,Besoin d'aide,Débutant en programmation , j'aimerai  modifié ce code ci-dessous qui fonctionne bien :write(to_server_socket,"Momo",15);read(to Client -> Serveur [ par norton ] Bonjour à tous. N'étant pas encore assez expérimenté dans le domaine des sockets je vous demande conseil.Je code sous Borland Builder C++ 6 avec les S Compilation impossible sous Visual C++ 2008 Express [ par AMokers ] Bonjours :) Je ne parviens pas à compiler une source. La source en question proviens du site cppfrance dont voici l'url :http://www.cppfrance.com/


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,640 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.