[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [linux] [OT] prog rzo C/C++



Mmmmhhhh


si je me souvient bien: tampon_requete, peut recevoir n'importe quelle type d'informations, toute aussi bien du text que du binaire.
de fait, le texte est vue comme du binaire et il n'y a pas le caractére de fin de ligne '/0'.

à noté que le fait fait d'allouer et de désallouer de la mémoire dans la boucle while est maladroite, du fait
que la fonction qui attend les messages est "recvfrom" à besoin de la mémoire. un "char tampon_requete[TAILLE_TAMPON]", serai tout aussi sufisant.

En plus ton serveur atend une connection, soit, dès qu'il a, il rentre dans ta boucle while. for bien.
mais quand ton client se deconnecte ? je ne voie pas de code relatif à ce ca de figure. ça doit ce cas qui renvoi un signal 2.
le fait de casser le socket, renvoie un signal. j'en ai fait l'experience.


Si ça peut d'aider ;)





Mmmmhhh,


si je prends cette portion de code:

<code-excerpt>
 longueur_requete = recvfrom(fd,
                             tampon_requete,
                             TAILLE_TAMPON,
                             0,
                             (struct sockaddr *)&adresse_socket_client,
                             (socklen_t *)&taille_adresse_socket_client);

 printf("%s:%d [%d]\t: %s\n",
        inet_ntoa(adresse_socket_client.sin_addr),
        ntohs(adresse_socket_client.sin_port),
        longueur_requete,
        tampon_requete);
</code-excerpt>

recvfrom() va placer longueur_requete bytes dans tampon_requete qui a une
taille maximum TAILLE_TAMPON > longueur_requete.
Initialement, tampon_requete était probablement rempli de caractères nuls
après le malloc (encore que ce ne sera pas forcément tjrs le cas).
Qd tu fais printf("%s", tampon_requete), tampon_requete doit être une chaîne
terminée par le caractère nul.
recvfrom() ne fait que stocker des octets dans le tampon, qu'il ne considère
pas comme une chaîne de caractère.
Ainsi, on a au départ tampon_requete = "\0\0\0\0" si TAILLE_TAMPON == 4.
Pour les appels successifs, on aura
1) tampon_requete = "d\0\0\0"    d'où printf() donne:   d
2) tampon_requete = "ee\0\0"                            ee
3) tampon_requete = "de\0\0"                            de

En réalité, si l'information que ton client envoie est une chaîne de
caractère,
il faut veiller à ce qu'il envoie aussi le caractère nul.
Donc, dans ta méthode Rzo::send, tu dois avoir longueur_requete =
word.size() + 1 car string::size renverra la taille de la chaîne proprement
dite (sans le caractère nul).

Dans ce cas, si après le malloc, on a tampon_requete = "garbage" pour
TAILLE_TAMPON == 7, tu auras les appels suivants:
1) tampon_requete = "d\0rbage"   d'où printf() donne:   d
2) tampon_requete = "ee\0bage"                          ee
3) tampon_requete = "d\0\0bage"                         d


Et voilà,

ça n'a donc rien à voir avec les winsocks quel que soit le point auquel tu
puisse les détester.

J'espère que j'aurai pu te dépanner,

Christophe.

-----Original Message-----
From: Benjamin Michotte [mailto:binny@baby-linux.net]
Sent: vendredi 24 août 2001 12:51
To: LinuxBe ML
Subject: [linux] [OT] prog rzo C/C++


salut,

en jouant avec les socket (et les winsocks (berk)), j'arrive à un
résultat assez surprenant... je vous fait voir...

binny@typhus:~$ ./rzo_server 44444
SERVEUR> Le serveur ecoute le port 44444
192.168.0.2:32772 [1]   : d
192.168.0.2:32772 [2]   : ee
192.168.0.2:32772 [1]   : de
SERVEUR> Arret du serveur (signal 2)

et en meme temps
binny@storia:~/tauceti/tauceti/client/functions$ ./rzo_test
ENVOI : d
REPONSE : d
ENVOI : ee
REPONSE : ee
ENVOI : d
REPONSE : de

d'ou peut venir ce problème des lettres qui restent ?

Le code du serveur est en C et celui du client en C++.

Je mets en attachement les fichiers sources...

merci de jeter un oeil

@+,
binny

ps: faites pas trop attention, je code comme un goret :)
ps2: si vous connaissez un bon tutorial/livre/autre sur les winsocks et
les sockets, je suis preneur... fr/en

--

Un coup de chaleur ? Passez sur La Banquise...
http://www.labanquise.org

      Benjamin Michotte        <binny@baby-linux.net>
 °v°  web      : http://www.baby-linux.net
 _o_  homepage : http://www.baby-linux.net/binny
      slaktool : http://slaktool.sourceforge.net
      icq uin  : 99745024






[ Soyez précis dans vos sujets svp afin de déterminer directement  ]
[ le type de demande...                                            ]
[ Pour vous (dés)inscrire, aller sur http://unixtech.be/ml.php     ]
[ Archives de la mailing list: http://archives.unixtech.be/linux/  ]
[ http://unixtech.be              Contact: listmaster@unixtech.be  ]