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

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

Marsh Posté le 28-11-2006 à 10:07:50    

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
Reply

Marsh Posté le 28-11-2006 à 10:07:50   

Reply

Marsh Posté le 28-11-2006 à 10:34:45    

- 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
Reply

Marsh Posté le 28-11-2006 à 11:34:45    

_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
Reply

Marsh Posté le 28-11-2006 à 11:48:44    

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


---------------
Töp of the plöp
Reply

Marsh Posté le 28-11-2006 à 11:54:52    

_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
Reply

Marsh Posté le 28-11-2006 à 13:48:55    

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
Reply

Marsh Posté le 28-11-2006 à 16:05:28    

_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
Reply

Marsh Posté le 28-11-2006 à 16:22:45    

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
Reply

Marsh Posté le 28-11-2006 à 16:46:55    

_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
Reply

Marsh Posté le 28-11-2006 à 16:53:10    

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


---------------
Töp of the plöp
Reply

Marsh Posté le 28-11-2006 à 16:53:10   

Reply

Marsh Posté le 28-11-2006 à 18:04:16    

_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/
Reply

Marsh Posté le 30-11-2006 à 14:52:22    

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
Reply

Sujets relatifs:

Leave a Replay

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