Comment distingué 2 clients dans un chat en mode tcp

[Résolu]
Signaler
Messages postés
33
Date d'inscription
lundi 19 juin 2006
Statut
Membre
Dernière intervention
15 novembre 2007
-
Messages postés
33
Date d'inscription
lundi 19 juin 2006
Statut
Membre
Dernière intervention
15 novembre 2007
-
slt tt le monde,

jé fé un pti source pour dialogué entre 2 client et un serveur avec le langage c sous unix, sachant ke avec la fontion accept elle retourne toujour un nouveau id de socket voici le code de la partie serveur :

while(1)
{
 nsd = accept(sd,(struct sockaddr *)&son_adr,&ss);
// lorske le client envoi un 2eme message , je je ve pa faire un accept, pour ne pa perdre la trace, cmt la sauvegarder ?
  if (nsd ==-1)
      {
          perror("accept");
          exit(3);
      }
   read(nsd,buf,sizeof(buf));
   printf ("le serveur a reçu ce message : %s\n",buf);
  
   if(strcmp(buf,"quit")==0)
     { close (nsd); }
  }

et voici le code de la partie client :

while (1)
{
   printf("ecrire le message \n");
   scanf("%s",&msg);
   write(sd,msg,sizeof(msg));
  if(strcmp(msg,"quit")==0)
   {close(sd);}

}

ce ke je , et lorsque j'ai 3 client qui se connecte au serveur, comment faire pour les distingué(gardé la trace d'un client),  autrement lorsque le serveur recoit des message d'un client , il doit savoir lekel dé 3 la envoyer ?

merci a tous

9 réponses

Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Normalement, ça devra travailler.

Voici un lien:
http://www.manualy.sk/sock-faq/unix-socket-faq-4.html
                         |
                         |
                         |
                         V
Voir le titre "


4.9 How do I get my server to find out the client's address / hostname?


"
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Pourquoi ne pas attruber des identifiant à ces clients en se basant sur leurs adresses IP.

La clef est l'adresse IP.
Messages postés
33
Date d'inscription
lundi 19 juin 2006
Statut
Membre
Dernière intervention
15 novembre 2007

et comment leur attribué ?
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:



La fonction "getpeername ()" vous dira qui est de l'autre cote de la connection.

Prototype:




#include <sys/socket.h>
int getpeername(int sockfd,
struct sockaddr *addr,
int *addrlen);











Voilà un lien intéressant :
http://www.chez.com/vidalc/lf/socket.html
Messages postés
33
Date d'inscription
lundi 19 juin 2006
Statut
Membre
Dernière intervention
15 novembre 2007

baraka allah fik (merci bc) est ce ke je pe l'utilisé dan le programme server ? et comment stp ?
c seulemnt pour savoir dan le serveur ; kel é le client ki a envoyé le message é faire un printf de ce genre :

printf("le client ? a envoyé le message %s \n", ? , msg);
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Comment ça va?
Messages postés
33
Date d'inscription
lundi 19 juin 2006
Statut
Membre
Dernière intervention
15 novembre 2007

merci bc , jé resolu ce pb , un autre je n'arrive tj pa a le resoudre é k'avec le meme code lorsque par exemple un client envoi 2 message un a un ,
le 1er sera recu dan le serveur tandi ke le 2eme non , comment resoudre pour pouvoir envoyer une succesuin de messages ?
Merci bc
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

Pour ta 2eme question je pense que tu dois créer des threads (un processus fils) à l'aide de la primitive fork.
Messages postés
33
Date d'inscription
lundi 19 juin 2006
Statut
Membre
Dernière intervention
15 novembre 2007

merci , j'ai pensé a ça aussi, je me sui di on méttant dan le code du fils : la primitive "accept" , et dans le code du pere : la primitive "read" , est ce ke ca marche comme ça ?