ch. méthode socket, comme linux : bytesAvailable() !URG! [C++/Builder] - C++ - Programmation
Marsh Posté le 11-05-2003 à 19:42:48
c est pour une bonen cause c est pour mon BTS
Marsh Posté le 11-05-2003 à 19:50:28
ou est le problème ? recv() te renvoie le nombre d'octets reçus !
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
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
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 !
Marsh Posté le 11-05-2003 à 20:33:11
voila mon code
Citation : Log* PortReseau::receptionnerTrame() |
en faite j ai 3 trames qui peuvent arriver,
il faut lire le SYN puis la décoder
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
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
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 ?
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
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
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
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
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
Marsh Posté le 11-05-2003 à 21:48:23
Code :
|
à 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 !
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
Marsh Posté le 11-05-2003 à 22:14:55
Code :
|
en espérant avoir compris ton truc...
Marsh Posté le 11-05-2003 à 22:23:19
ouais c est pas mal ton truc
faut que j y réfléchisse...
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
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
Marsh Posté le 11-05-2003 à 23:24:29
++Taz a écrit : ça marche pas, c'est meme bugé |
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
Marsh Posté le 11-05-2003 à 23:26:17
ReplyMarsh 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() |
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
---------------
=-Galerie Photo=- // Tekilaz :: Trop bon, Trop con... // FEEDB4CK