[C++/Builder] ch. méthode socket, comme linux : bytesAvailable() !URG!

ch. méthode socket, comme linux : bytesAvailable() !URG! [C++/Builder] - C++ - Programmation

Marsh Posté le 11-05-2003 à 19:33:28    

VOila
je trvail sur les socket en C++
et cj cherche une méthode sous windows capable de déterliner la tailler de la trame qui va arriver par la socket .
 
sous linux c est simple c est  
nbChar = socket->bytesAvailable()
 
et hop dans nbChar on a la taille de la trame qui va arriver
Si quelqu un a la soluce SVP C est pas mal urgent
 
car je peux recevoir des trmaes de tailles différentes et à chaque trame différente (de par leur taille), le traitement l est aussi
 
Need HELP  :o


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 19:33:28   

Reply

Marsh Posté le 11-05-2003 à 19:42:48    

[:yoyoz]  
c est pour une bonen cause c est pour mon BTS


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 19:50:28    

ou est le problème ? recv() te renvoie le nombre d'octets reçus !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-05-2003 à 20:14:16    

Harkonnen a écrit :

ou est le problème ? recv() te renvoie le nombre d'octets reçus !


ben j utilise la méthone ReadBuffer
 
car ma socket est faite par un compsant Indy
TldTcpClient


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 20:19:07    

client->ReadBuffer(reponse,18);
 
j utilise cette méthode pour lire les trames qui arrivent
mais le Hic c est que je dois mettre la taille de la trame qui arrive et cette trame est varaible
 
donc si il y avait un méthode capable de me le dire
Recv() alors? mais je cpate pas ca renvoie seulement le nb d octt recus mais pas dispo sur la socket


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 20:23:56    

je comprends pas la... recv() te renvoie le nombre d'octets reçus en cas de succés, sinon 0. donc on peut penser que si la valeur de retour est > 0, alors le nombre d'octets reçus == le nombre d'octets dispo...
 
edit: et je suppose que la méthode ReadBuffer de ton composant doit faire la même chose !


Message édité par Harkonnen le 11-05-2003 à 20:24:47

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-05-2003 à 20:33:11    

voila mon code

Citation :

Log* PortReseau::receptionnerTrame()
{
   Log *log;
   reponse = new char[40];
   memset(reponse, 0x00, strlen(reponse));
   if(!synchro)
   {
      client->ReadBuffer(reponse,1);
   }
   switch(reponse[0])
   {
      case SYN:
         //cas d'une synchronisation
         client->ReadBuffer(reponse,18);
         this->acquitter();
         if (acquitement == true)
         {
            synchro = true;
            Conversion * conversion = new Conversion(reponse, type);
            log = conversion->ConstituerLog();
            delete conversion;
         }
      break;
      case ESC:
         etat = FIN_TRAME;
         break;
 
      default:
 
         client->ReadBuffer(reponse,18);
         if(reponse[0] != ESC)
         {
            this->acquitter();
            if (acquitement == true && synchro == true)
            {
               Conversion * conversion = new Conversion(reponse, type);
               log = conversion->ConstituerLog();
               delete conversion;
            }
         }
         else
         {
            this->finRequete = true;
         }
         break;
   }
 
   delete reponse;
   return log;
}


 
en faite j ai 3 trames qui peuvent arriver,

  • la permiere de 19 octets qui a pour 1er octet le caractere SYN

il faut lire le SYN puis la décoder

  • la deuxième qui est la donnée sur 18 octets (donc = à la premiere sans le SYN) , donc a décoder
  • la troisiemen, qui fait 7 octets, qui contines le caractere ESC en premier octet permettant de dire qu il n y a plus de trame a recevoir


Dès que la 3eme arrive alors le programme quitte
mais le truc c est que  j envoie bien les 7 octets, mais quand je les recois j ai n importe quoi, alors je me dis que c est parce que j ai que 7 octets a recevoir et que j en lis 18, donc il maurait fallu une méthode qui détecte combien d octets étaient à recevoir, chose que fait la méthode BytesAvailable sous NUX


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 20:47:35    

Tu dis que tu as 7 octets à recevoir et que tu en lis 18 ( client->ReadBuffer(reponse,18)).
D'ou ma question : pourquoi ne pas lire 7 octets au lieu de 18 :??:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-05-2003 à 20:50:29    

ben c est simple
les trames qui arrives je les controles pas
 
donc il faut que ce soit ma méthode qui le détecte
di j en lis que 7, quand c est une trame de 18 qui arrive je fais comment ?


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 21:04:25    

y'a un truc que j'aimerais savoir : pourquoi recevoir 3 paquets alors que 2 suffiraient, puisque le second est égal au premier sans le SYN ? tu reçois le 1er, tu extrais le SYN et tu lis ensuite le reste.
quand au 3eme paquet, que tu reçoive 7 caractères ou 18, à la limite on s'en fout puisque tu ne lis que le premier apparemment !
 
voila comment je verrais l'algo :
 
1 - tu lis un premier paquet
2 - si le 1er caractère == SYN, alors tu lis et décode les 18 octets suivants (mais du même paquet)
3 - tu lis le paquet suivant
4 - si le 1er caractère == ESC, alors fin du traitement
5 - sinon retour au 2


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-05-2003 à 21:04:25   

Reply

Marsh Posté le 11-05-2003 à 21:14:12    

oki
mais si une trame de 18 octets arrive et qu elle ne contient ni SYN ni ESC
alors  
avec l algo
le lis le 1er octet,
c est ni l un ni lautre
je relis ce qui arrive, mais coup j aiperdu le 1er octet dans l histoire
je sais pas comment faire pour lire le 1er octet
le mettre dans un char de 18, a l emplacement 0, puis le reste de ce que je lis je le mets a la suite.
je sais pas si tu me suis toujours
et cest justement cet algo je sais pas comment le coder


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 21:22:09    

ben si elle ne contient ni SYN ni ESC, alors c'est qu'il y a une merde dans l'envoi et voila, puisqu'a priori tu ne peux recevoir que 3 paquets :  
- un paquet avec SYN + 18 octets
- un autre paquet avec les 18 octets du 1er (double emploi à mon avis)
- un dernier paquet avec ESC + 6 octets.
 
donc si tu reçois un paquet qui ne contient ni SYN ni ESC, ça veut donc dire que c'est soit un paquet foireux (donc à jeter), soit le paquet contenant les 18 caractères, ce que tu peux facilement vérifier en comparant ce paquet avec les 18 caractères suivant le SYN du 1er paquet
 
j'avoue que j'ai du mal à te suivre la :heink:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-05-2003 à 21:35:59    

nan le paquet qui a ni SYN ni ESC a un pour premier octet STX
 
c est simple
ma
 
méthode recoit une trame de 19 octets avec 1er caractere SYN, puis une trame de donnée
il calcule le CRC, puis envoie ACK si tout va bien
 
du coup apres il recoit la donnée sous forme de trame de 18 octets, calcul le CRC, puis envoie ACK si tout va bien
>>ceci se passe N Fois, ca dépend de la taille de la donnée a envoyer. Ceci se fait jusqu attends qu on recoive une trame ayant pour premier octet ESC. (elle fait 7 octects cellequi contient ESC).
 
 
au faite MERCI bcp de m aider  :jap:  :jap:  :jap:


Message édité par tekilaz le 11-05-2003 à 21:36:57

---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 21:42:02    

Client                      Server
-----------requete------------------>
 
<---SYN+1ere trame--(19oct)---------
 
----------------ACK----------------->
 
<--------Donnee 18oct---------------
 
----------------ACK----------------->
 
<---------FIN requete "ESC" 7 oct----
 
voila comment ca marche, la on est coté Client


Message édité par tekilaz le 11-05-2003 à 21:43:19

---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 21:48:23    

Code :
  1. - tu lis un premier paquet
  2. - tu en extrait le 1er caractère
  3. while (le 1er caractère de ton paquet != ESC)
  4. {
  5.    switch (1er caractère)
  6.    {
  7.       case SYN:
  8.          calculer ton CRC
  9.          renvoyer ACK
  10.          break
  11.       case STX:
  12.          calculer ton CRC
  13.          renvoyer ACK
  14.          break
  15.       default;
  16.          break;
  17.    }
  18.    lire le paquet suivant
  19. }


à priori ça semble correspondre à ce que t'as dit, mais on voit bien quand même une redondance dans l'algo : les 2 premiers case: sont identiques !
       


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-05-2003 à 21:58:28    

oui car en faite
tant que je recois pas le SYN je ne commence pas a recevoir les trames,
donc des que je recois le SYN, je décode la 1ere trame et mets un bool applé SYN a TRUE, ce qui me permet de savoir que toutes les trames qui vont arriver seront a décoder tant que je recois pas une trame avec comme 1er octet ESC
 
le truc c est que je sait bien que je fais presque pareil mais en fait nan car :
je rentre dans le 1er CASE afin de mettre la synchro a TRUE
et tant que j ai pas ca je peux pas aller dans le 2eme cas
 
ralala c est dur a expliquer, je suis sur que je suis pas clair


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 22:14:55    

Code :
  1. - SYN = false;
  2. - tu lis un premier paquet
  3. - tu en extrait le 1er caractère
  4. while (le 1er caractère de ton paquet != ESC)
  5. {
  6.    if (1er caractère == SYN)
  7.    {
  8.        SYN = true;
  9.    }
  10.    if (SYN == false)
  11.    {
  12.       lire le paquet suivant
  13.       continue; // c'est le mot clé 'continue'
  14.    }
  15.    else
  16.    {
  17.       calculer ton CRC
  18.       renvoyer ACK
  19.       lire le paquet suivant
  20.    }
  21. }
  22. réception terminée


en espérant avoir compris ton truc...


Message édité par Harkonnen le 11-05-2003 à 22:16:59

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 11-05-2003 à 22:23:19    

ouais c est pas mal ton truc
faut que j y réfléchisse...  :pt1cable:


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 22:58:11    

ça marche pas, c'est meme bugé
 
reponse = new char[40];
memset(reponse, 0x00, strlen(reponse));
 
pourquoi passer par un new?
tableau initialisé (ou pas, ché pu, j'ai pas le bouquin sous les yeux), en tout cas, si strlen te fait pas un segfault, il vaudra jamais 40
 
 
 
eidt: et log est pas initialisé à 0, et comme tu l'affecte conditionnellement, y a des chances que tu retournes n'importe quoi
 
par contre
 
 
char reponse[40];
memset(reponse, 0, sizeof reponse);  
 
fonctionne tres bien


Message édité par Taz le 11-05-2003 à 23:02:21
Reply

Marsh Posté le 11-05-2003 à 22:59:51    

bien joué
 
if (SYN == false)
 
 
amis de la logique bonsoir, l'interet des booléens c'est à la base de faire == pour tester

Reply

Marsh Posté le 11-05-2003 à 23:24:29    

++Taz a écrit :

ça marche pas, c'est meme bugé
 
reponse = new char[40];
memset(reponse, 0x00, strlen(reponse));
 
pourquoi passer par un new?
tableau initialisé (ou pas, ché pu, j'ai pas le bouquin sous les yeux), en tout cas, si strlen te fait pas un segfault, il vaudra jamais 40
 
 
 
eidt: et log est pas initialisé à 0, et comme tu l'affecte conditionnellement, y a des chances que tu retournes n'importe quoi
 
par contre
 
 
char reponse[40];
memset(reponse, 0, sizeof reponse);  
 
fonctionne tres bien


 
merci pr le new reponse
je test demain et je te dis
mais ca résoud pas mon pbleme de détection de SYN
promis je planche ca demain et je post si j ai la soluce
 
pS : faut etre indulgent chui un peu n00b en prog


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 11-05-2003 à 23:26:17    

:sleep:


---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK
Reply

Marsh Posté le 15-05-2003 à 13:47:37    

bon ben j ai réussi a faire marcher ma méthode,
j ai dis que je postai doc la voila :
 
 

Citation :

Log* PortReseau::receptionnerTrame()
{
   Log *log;
   reponse = new char[40];
   memset(reponse, 0x00, strlen(reponse));
 
   if(!synchro)
   {
      client->ReadBuffer(reponse,1);
   }
   switch(reponse[0])
   {
      case SYN:
         //cas d'une synchronisation
         client->ReadBuffer(reponse,18);
         this->acquitter();
         if (acquitement == true)
         {
            synchro = true;
            Conversion * conversion = new Conversion(reponse, type);
            log = conversion->ConstituerLog();
            delete conversion;
         }
      break;
      case ESC:
         etat = FIN_TRAME;
         break;
 
      default:
 
         ::Sleep(100);
         client->ReadBuffer(reponse,7);
         if(reponse[0] != ESC)
         {
            char * repTemp = new char[11];
            client->ReadBuffer(repTemp,11);
            for(int i = 0; i<11;i++)
            {
               reponse[7+i] = repTemp[i];
            }
             
            this->acquitter();
            if (acquitement == true && synchro == true)
            {
               Conversion * conversion = new Conversion(reponse, type);
               log = conversion->ConstituerLog();
               delete conversion;
            }
         }
         else
         {
            this->finRequete = true;
         }
         break;
   }
 
   delete reponse;
   return log;
}

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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