Bonjour !
Je travaille actuellement sur la réalisation d'un chat très sommaire en C. La solution que j'ai adoptée consiste, côté serveur, à avoir un tableau de clients connectés contenant leur nom et le numéro de descripteur de la socket créée pour la communication avec eux.
Je définis ces sockets comme non bloquantes et je boucle sur les descripteurs jusqu'à recevoir un message. Lorsque c'est le cas, je le renvoie à tous les clients connectés, sauf l'envoyeur.
Cependant ça ne se passe pas exactement comme prévu, quand un client envoie un message au serveur, tout se passe comme si il le recevait à chaque tour de boucle, et qu'il le renvoyait en boucle aux clients...
Je n'ai pas trouvé de solution à ce problème étant donné que cette solution bourine est très peu utilisée. J'envisage également de tester la fonction select() mais auparavant j'aimerais quand même que ma solution fonctionne...
Je joins à mon message le bloc qui pose problème, en espérant que vous pourrez m'aider sur le fonctionnement bizarre de ma fonction recv() !
Merci bien.
/*tabDesc contient les descripteurs de socket
*l'attribut descBrCv est égal à -1 si cette case est vide
*/
if(tabDesc[indexDesc].descBrCv != -1) {
char *msg = (char*)malloc(sizeof(char)*1000);
//si on reçoit un message
if(recv(tabDesc[indexDesc].descBrCv,msg,strlen(msg),0) != -1) {
cout<<"message recu !"<<endl;
//on l'envoie à chaque client sauf celui qui a envoyé le message
for (int i=0;i<NB_CLIENT;i++) {
if(tabDesc[i].descBrCv!=-1 && i != indexDesc) {
char* envoi = new char[strlen(msg)+strlen(tabDesc[i].nom)+4];
strcat(envoi,tabDesc[i].nom);
strcat(envoi," : ");
strcat(envoi,msg);
int retourSend =send(tabDesc[i].descBrCv,envoi,strlen(envoi),0);
if(retourSend==-1)
perror("Erreur envoi");
}
}
}
}
D'autre part voici le code d'envoi de message d'un client, montrant que ce n'est pas le client qui envoie en boucle...
char envoi[1000];
while(cin>>envoi) {
int retourSend = send(descBrCli,envoi,sizeof(envoi),0);
if(retourSend == -1)
perror("Erreur émission");
}