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