[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: [linux] [OT] prog rzo C/C++
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 ]