Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1280 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Probleme de débutant...

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme de débutant...

n°1461696
guiguivts
Posté le 20-10-2006 à 22:00:35  profilanswer
 

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
mood
Publicité
Posté le 20-10-2006 à 22:00:35  profilanswer
 

n°1461715
nargy
Posté le 20-10-2006 à 22:41:49  profilanswer
 

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

n°1461729
Emmanuel D​elahaye
C is a sharp tool
Posté le 20-10-2006 à 23:01:54  profilanswer
 

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/
n°1461736
nargy
Posté le 20-10-2006 à 23:14:00  profilanswer
 

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.

n°1461741
Emmanuel D​elahaye
C is a sharp tool
Posté le 20-10-2006 à 23:24:28  profilanswer
 

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/
n°1462050
guiguivts
Posté le 21-10-2006 à 17:41:57  profilanswer
 

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 :)

n°1462346
guiguivts
Posté le 22-10-2006 à 11:01:11  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Probleme de débutant...

 

Sujets relatifs
[Ajax de débutant] : problème avec l'attribut status ?!Problème compliqué pour débutant php
PROBLEME DE DEBUTANT VRAIMENT PAS TRES DOUEproblème avec mon formulaire perl/cgi (debutant)
Probleme sur petit programme de débutant[html] problème de tableau ( débutant )
probleme de pure débutantprobleme de débutant
[C] [Debutant] Petit problème avec un programme tout bete 
Plus de sujets relatifs à : Probleme de débutant...


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR