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

  FORUM HardWare.fr
  Programmation
  C

  [ socket ] Récupérer un autre Buffer de la fonction recv()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ socket ] Récupérer un autre Buffer de la fonction recv()

n°1482815
Bad_Day
Posté le 28-11-2006 à 10:07:50  profilanswer
 

Bonjours

 

J'ai fais une petite application client/serveur (grâce au sockets), le client est fait en utilisant aussi l'Api Win 32...
Donc, j'ai crée des bouton (dans l'application client) qui envoient (si en clique sur un des bouton) une chaîne de caractère au serveur qui la traite selon le cas.
Mais j'ai un petit problème:
Il y a un bouton qui sers à ouvrir un fichier (par le serveur), et un autre qui sers à le fermé.

 

Càd dés qu'on clique sur le 1er bouton dans l'application client il envois une chaîne au serveur qui la traite (pour ouvrir le file).
Et dés qu'on appuis sur le 2eme bouton il envois une chaîne au serveur qui la traite (pour fermé le file)

 

Voila un petit aperçu au niveau du traitement (par le serveur) :

 
Code :
  1. //<...> <...>
  2. FILE* fichier = NULL;
  3. // Dans une boucle while(continuer) je fait ceci :
  4. error = recv(csock, bufferRecv, sizeof(bufferRecv)-1, 0);
  5. bufferRecv[error] = '\0';
  6. if(strcmp(bufferRecv,"BOUTON1" ) == 0)
  7. {
  8. fichier = fopen("BadDay.txt", "a" );
  9. while(1)      // c'est là que j'ai le probléme, comment fair pour sortire de la boucle...?
  10. {
  11.  VariableChar = GetAChar();
  12.  if(VariableChar != '\0') fprintf(fichier, "%c", VariableChar);
  13.  Sleep(130);
  14. }
  15. }
  16. else if(strcmp(bufferRecv,"BOUTON2" ) == 0)
  17. {
  18. fclose(fichier);
  19. }
  20. //<...> <...>
 


Le problème c'est que quand le BOUTON1 est appuyé, càd bufferRecv == "BOUTON1" :
J'ouvre le fichier BadDay.txt et je rentre dans une boucle infinie....  et je ne peut pas fermer le fichier car le bufferRecv ne reçois pas la chaîne "BOUTON2"  quand j'appuis sur le 2eme bouton, et c'est normale puisque je suis dans une boucle infinie. while(1) {...}  .

 

Donc je ponçais a faire un fonction Exit ( un truc du genre while(!Exit) {} ) , pour sortir de la boucle quand en appuis sur le bouton 2, Mais je ne vois pas trop comment faire...

 

Je ponçais aussi a faire un teste if(strcmp(bufferRecv,"BOUTON2" ) == 0) dans le corps même de ma fonction GetAChar(); en lui passent le bufferRecv comme paramètre... mais ça ne marchera pas, puisque la fonction recv() et en dehors de la boucle while(1)...   A mois que je fasse un autre recv pour le même buffer ?

Si quelqu'un peut me donnez une idée......

 

J'espère que vous avez compris ce que je voulais dir.
En d'autre terme je voudrai récupérer le bufferRecv même si je suis dans la boucle while(1) {..} ...
 
thank you for your help.


Message édité par Bad_Day le 28-11-2006 à 16:50:41
mood
Publicité
Posté le 28-11-2006 à 10:07:50  profilanswer
 

n°1482848
_darkalt3_
Proctopathe
Posté le 28-11-2006 à 10:34:45  profilanswer
 

- ton getachar, il choppe les caracteres d'ou ?
- il faut conditionner ton while pour s'arreter quand il n'y a plus de caracteres non ?
 
 


---------------
Töp of the plöp
n°1482874
Bad_Day
Posté le 28-11-2006 à 11:34:45  profilanswer
 

_darkalt3_ a écrit :

getachar, il choppe les caracteres d'ou ?
il faut conditionner ton while pour s'arreter quand il n'y a plus de caracteres non ?


Justement, c'est le client qui décide s'il n y a plus de caractéres. (en envoyant la chaine "BOUTON2" ).. et c'est là le probléme !

 



Message édité par Bad_Day le 28-11-2006 à 11:35:10
n°1482902
_darkalt3_
Proctopathe
Posté le 28-11-2006 à 11:48:44  profilanswer
 

ok mais ils viennent d'ou tes caracteres ? ton getachar, il lit quoi concretement ?


---------------
Töp of the plöp
n°1482909
Bad_Day
Posté le 28-11-2006 à 11:54:52  profilanswer
 

_darkalt3_ a écrit :

ok mais ils viennent d'ou tes caracteres ? ton getachar, il lit quoi concretement ?


GetAChar est une fonction un peut complexe (je ne l'ai pas encor términé) qui lit des caractéres qui sont tapé sur une autre application que j'ai fait en plus du serveur...
Mais ce n'ai pas le plus important.

 


Pour mon probléme, ta pas une idée ? est-ce-que je pourai faire un autre recv() dans la boucle while pour recevoire le buffer "BOUTON2" ?

 


Message édité par Bad_Day le 28-11-2006 à 12:00:39
n°1482989
_darkalt3_
Proctopathe
Posté le 28-11-2006 à 13:48:55  profilanswer
 

Je crois que t'as un probleme de design; un boucle infinie ca craint.
 
Regarde si tu peux pas faire quelque chose en threadant ton traitement


---------------
Töp of the plöp
n°1483101
Bad_Day
Posté le 28-11-2006 à 16:05:28  profilanswer
 

_darkalt3_ a écrit :

Regarde si tu peux pas faire quelque chose en threadant ton traitement


J'ai déjà essayé avec les threads, ça a foutu le bordel dans toute l'application..., si je les utilise je dois modifier tout le prog... mais bon si c'est le seul moyen je vais tout refaire.

 

Je vais avant ca, essayer de faire un autre recv() dans la boucle while(1){} , et tester, si elle reçois la chaîne "BOUTON2" je quitte la boucle sinon je continue,
Mais le problème c'est: si elle ne reçois rien je dois aussi continuer,
humm je ne sais pas ce que la fonction revc() retourne quand elle ne reçois rien...

 

EDIT: elle ne retourn rien c'est une fonction bloquante.

  


Message cité 1 fois
Message édité par Bad_Day le 28-11-2006 à 16:48:17
n°1483129
_darkalt3_
Proctopathe
Posté le 28-11-2006 à 16:22:45  profilanswer
 

Bad_Day a écrit :

je ne sais pas ce que la fonction revc() retourne quand elle ne reçois rien...


 
Il me semble qu'elle te renvoie le nombre de caractère lus
A vérifier.
 
Tu bosses sans doc ? [:pingouino]


---------------
Töp of the plöp
n°1483154
Bad_Day
Posté le 28-11-2006 à 16:46:55  profilanswer
 

_darkalt3_ a écrit :

Il me semble qu'elle te renvoie le nombre de caractère lus
A vérifier.


Oui mais quand elle ne reçoi rien (Si aucun message n'est disponible) elle ne retourne rien elle ce met en attente.
Oh non, je dois donc rendre la socket non bloquante, avant de rentrer dans la boucle...

 



Message édité par Bad_Day le 28-11-2006 à 16:49:43
n°1483161
_darkalt3_
Proctopathe
Posté le 28-11-2006 à 16:53:10  profilanswer
 

Ou utilises select() pour connaitre l'état de ta chaussette


---------------
Töp of the plöp
mood
Publicité
Posté le 28-11-2006 à 16:53:10  profilanswer
 

n°1483265
Emmanuel D​elahaye
C is a sharp tool
Posté le 28-11-2006 à 18:04:16  profilanswer
 

_darkalt3_ a écrit :

Ou utilises select() pour connaitre l'état de ta chaussette


Les codes retours sont ;

enum {PROPRE, SALE, PUANTE, PERCEE};



---------------
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°1484335
Bad_Day
Posté le 30-11-2006 à 14:52:22  profilanswer
 

J'ai résolu le probléme en rendant la socket non bloquant et faire un autre recv() dans la boucle while()

 
Code :
  1. if(strcmp(bufferRecv,"BOUTON1" ) == 0)
  2. {
  3.        int continuer = 1;
  4.        // rendre la socket non bloquante
  5.        u_long argp=1;
  6.        ioctlsocket(csock, FIONBIO, &argp);
  7.        fichier = fopen("Bad_Day.txt", "a" );
  8.        while(continuer)
  9.        {
  10.              Ch = GetAChar();
  11.              if(Ch != '\0') fprintf(fichier, "%c", Ch);
  12.              error = recv(csock, bufferRecv, sizeof(bufferRecv)-1, 0);
  13.              if(error == 0)
  14.              {
  15.                 go = 0;  // pour sortire de la 1er boucle principale (pour quitter)
  16.                 continuer = false;
  17.               }
  18.               else
  19.               {
  20.                    bufferRecv[error] = '\0';
  21.                    if(strcmp(bufferRecv,"BOUTON2" ) == 0)
  22.                    {
  23.                        continuer = false;
  24.                     }
  25.                 }
  26.                 Sleep(130);
  27.            }
  28.            fclose(fichier);
  29.            // rendre la socket bloquante
  30.            argp=0;
  31.            ioctlsocket(csock, FIONBIO, &argp);
  32. }


Message édité par Bad_Day le 30-11-2006 à 14:55:59

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

  [ socket ] Récupérer un autre Buffer de la fonction recv()

 

Sujets relatifs
différence entre fonction et méthodecomment recuperer le username de la session windows avec delphi 7 !,
Comment activer la fonction " bascule plein ecran" au player video flchanger focus d'un select en fonction choix autre select
transfère de fichier à travers les socketfonction qui renvoie les 4 derniers caractères en vc++ ?
Récuperer le login du poste.Problème avec la Fonction GET['etat']
Récupérer Taille boutonconst devant une fonction
Plus de sujets relatifs à : [ socket ] Récupérer un autre Buffer de la fonction recv()


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