Probleme de débutant...

Probleme de débutant... - C - Programmation

Marsh Posté le 20-10-2006 à 22:00:35    

Salut
 
Petit probleme de programmation en C si quelqu'un pouvait m'aider svp.. :)  
 
je fais une appli client/serveur une sorte de tchat sous console.  
 
voilà le pb  
 
le client n°1 envoie le message " bonjour "  
le client n°2 recoit le message " bonjour "  
 
le client n°1 envoie le message " lol "  
le client n°2 recoit le massage " loljour "  
 
:L il y a une espece de sauvegarde du premier mot qui met le bazar..  
 
voilà 3 bouts de codes ou le probleme pourrait se situer je pense..
 
Au niveau du serveur on scan le socket en relation avec le serveur
 

Code :
  1. while(1)
  2. {
  3.   strcpy(buf,"" ); // on vide le buffer
  4.   printf(" buffer avant : %s\n",buf); // on l'affiche  
  5.   lon=read(soc, buf, sizeof(buf)); // on enregistre ce qu'il y a dans le socket
  6.   buf[lon]='\0'; // on rajoute le caractere de fin de ligne
  7.   printf(" buffer apres: %s taille :%d\n",buf,strlen(buf));  // on affiche ce qu'il y a  dans le buffer  
  8.   send_all(buf,soc); // on envoie le message à tous les clients
  9.   };


 
Ce qu'il y a de bizarre c est que dans le bout de code ci dessus tous les affichages de buf sont corrects mais le client ne reçoit pas la même chose :-( ( et pourtant je ne touche plus au buf apres..)
 
et le bout de code ou le client écrit son message :
 

Code :
  1. while(1)
  2.     {
  3.      scanf("%s",&mesg); // on lit son message
  4.       write(sd, mesg, strlen(mesg));  // on l envoie au serveur
  5.     }


 
et le bout de code ou le client reçoit le message du serveur
 

Code :
  1. while(1)
  2.     {
  3.     read(sd, buf, sizeof(buf));  // on lit ce qu'il y a sur le socket
  4.     write(1,buf,strlen(buf));    // et on l'affiche  
  5.    }


 
 
Voilà :( j'ai fait pas mal de recherche mais ça n'a rien donné..  
 
help me please :)

Message cité 1 fois
Message édité par guiguivts le 20-10-2006 à 22:01:31
Reply

Marsh Posté le 20-10-2006 à 22:00:35   

Reply

Marsh Posté le 20-10-2006 à 22:41:49    

code serveur:
- ligne 4: inutile
- send_all: c'est quoi le code? (au cas où)
 
affichage client:
- ligne 4: sizeof(buf)?
- ligne 6: tu est en train d'afficher TOUT le buffer, même si le read précédant n'a pas tout écrit

Reply

Marsh Posté le 20-10-2006 à 23:01:54    

guiguivts a écrit :

je fais une appli client/serveur une sorte de tchat sous console.  
 
le client n°1 envoie le message " bonjour "  
le client n°2 recoit le message " bonjour "  
 
le client n°1 envoie le message " lol "  
le client n°2 recoit le massage " loljour "  
 


Erreur récurrente. Sans regarder le reste, je dis que tu as oublié de placer un 0 dans ta chaine pour la terminer. Pour ça, aide toi de la valeur retournée par recv(), et n'oublie pas de réserver une place pour le 0 quand tu passes la taille du tableau à recv()... (C'est bien fait au niveau de le réception serveur).
 
http://mapage.noos.fr/emdel/reseaux.htm
 
P.S. J'ai finalement lu ton code, c'est bien ce problème. Pour les sockets, plutôt que read()/write() (pas portable du tout), tu devrais utiliser recv()/send(). Au moins, c'est POSIX.1


Message édité par Emmanuel Delahaye le 20-10-2006 à 23:11:01

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 20-10-2006 à 23:14:00    

Je ne suis pas sûr que le problème se résume à un \0 manquant... recv, send, read et write n'en tiennent pas compte. En fait il ne faudrait même pas envoyer de 0, qu'il n'est pas recommandé d'écrire avec write sur un terminal, ou alors utiliser printf et des vérifications sur les débordements de buffer.

Reply

Marsh Posté le 20-10-2006 à 23:24:28    

nargy a écrit :

Je ne suis pas sûr que le problème se résume à un \0 manquant... recv, send, read et write n'en tiennent pas compte. En fait il ne faudrait même pas envoyer de 0, qu'il n'est pas recommandé d'écrire avec write sur un terminal, ou alors utiliser printf et des vérifications sur les débordements de buffer.


Ben si :  
 
Serveur (presque OK)

Code :
  1. lon=read(soc, buf, sizeof(buf)); // on enregistre ce qu'il y a dans le socket
  2.    buf[lon]='\0'; // on rajoute le caractere de fin de ligne

sauf qu'on doit réserver une place pour le 0 :  

Code :
  1. lon=read(soc, buf, sizeof buf -1); // on enregistre ce qu'il y a dans le socket
  2.    buf[lon]='\0'; // on rajoute le caractere de fin de ligne


 
client (catastrophe)

Code :
  1. read(sd, buf, sizeof(buf));  // on lit ce qu'il y a sur le socket
  2.    write(1,buf,strlen(buf));    // et on l'affiche


strlen() sur une chaine invalide, justement parce que le 0 n'est, comme il se doit, pas transmis[1]. (on doit en principe terminer la ligne par un \n)
--------------
[1] enfin, on suppose, vu qu'on a pas le code se send_al()...
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-10-2006 à 17:41:57    

Merci pour les réponses j'ai résolut le probleme
 
J'ai remplacer tous mes scanf et autres read par  
 
resread=read( entree , buf , 512 );
buf[resread]='\0'
 
J'ai pas très bien compris pourquoi mais tout fonctionne :)

Reply

Marsh Posté le 22-10-2006 à 11:01:11    

Hello
 
est ce qu'il serait possible que le client affiche ses messages entrant dans un autre terminal que le terminal courant ?  
 
merci :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed