Socket/send/recv

Résolu
samuraijack1412 Messages postés 26 Date d'inscription samedi 29 novembre 2008 Statut Membre Dernière intervention 13 juin 2009 - 11 juin 2009 à 10:06
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 13 juin 2009 à 19:20
Bonjour,

Je suis en train d'écrire une application de "chat". Elle se compose d'un client et d'un serveur.

Maintenant, je veux que le client puisse envoyer un tableau des entiers au serveur.

Sur le client:

int config[49];
SOCKET sock;

for(i=0;i<49;i++)
config[i]=100;
...
send(sock,(char *)config,sizeof(config),0);

Sur le serveur:

int config[49];
SOCKET sock;

...
recv(sock,(char *)config,sizeof(config)*sizeof(char),0);

Normalement, le serveur doit recevoir un tableau de 49 valeurs 100. Mais, il a reçu un tableau de 49 valeurs dont seulement 12 premières valeurs sont 100 et les autres sont bizzares!

Que je dois faire? Merci!

8 réponses

samuraijack1412 Messages postés 26 Date d'inscription samedi 29 novembre 2008 Statut Membre Dernière intervention 13 juin 2009
13 juin 2009 à 07:48
Bonjour,

Merci. Mais bon, j'ai trouvé l'erreur. En fait, comme sizeof(char)=1 et  que sizeof(int)=4, la taille du tableau original, en convertissant en (char *), est réduite avant d'être envoyé. Donc, il faut faire comme suivant:

send(sock, (char *)config, sizeof(config)*sizeof(int), 0);

recv(sock, (char *)config, sizeof(config)*sizeof(int), 0);

Voilà!
3
samuraijack1412 Messages postés 26 Date d'inscription samedi 29 novembre 2008 Statut Membre Dernière intervention 13 juin 2009
11 juin 2009 à 10:11
Re Bonjour,

J'ai éditer ma question précédente sur Safari, alors, elle est bizzare. Voilà, mon problème est le suivant:

Je suis en train d'écrire une application de "chat". Elle se
compose d'un client et d'un serveur.

Maintenant, je veux que le client
puisse envoyer un tableau des entiers au serveur.

Sur le client:

int
config[49];
SOCKET sock;
for(i=0;i<49;i++) config[i]=100;
...

send(sock,(char *)config,sizeof(config),0);

Sur le serveur:

int
config[49];
SOCKET sock;
...
recv(sock,(char
*)config,sizeof(config)*sizeof(char),0);

Normalement, le serveur doit
recevoir un tableau de 49 valeurs 100. Mais, il a reçu un tableau de 49
valeurs dont seulement 12 premières valeurs sont 100 et les autres sont
bizzares!

Que je dois faire? Merci!
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
11 juin 2009 à 17:55
Salut,

12 valeurs correctes ? Ca ressemble étrangement à 100 / 8 = 12,5.

Tu dois avoir un problème int/char quelque part. Genre config[49] déclaré en char sur le serveur.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
11 juin 2009 à 17:56
Heu je veux dire 49 / 4, 4 étant la taille d'un int et 49 la taille de ton tableau...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
13 juin 2009 à 06:18
Salut,
le problème vient de

send(sock,(char *)config,sizeof(config),0);

send() ne peut envoyer que des char, il faut donc au choix:
* envoyer les ints un par un APRES les avoir converti en char*
* ou concaténer un char* contenant une chaine valide et l'envoyer. Utilisation d'un caractère séparateur.

char buf[1500];
int len = 0;

for(i=0;i<49;i++)
{
config[i]=100;
len += sprintf(buf, "%d-", ints[i]); //tiret séparateur
}

printf("envoi de la chaine suivante: [%s]\n", buf);
send(sock, buf, len, 0);


Voila, bon courage pour la suite!
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
13 juin 2009 à 06:27
Apparemment problème de sauts de ligne avec google chrome ici aussi.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
13 juin 2009 à 19:17
Sauf que c'est pas logique mais bon...

Tu vas te dire, mais qu'est ce qu'il vient m'embêter celui là, mais je me lance quand même. Pour que la vérité triomphe dirons nous.
Partons de ton hypothèse :
sizeof(char)= 1
sizeof(int)=4

C'est souvent vrai. Il faudrait vraiment que tu soit sur un serveur unix 64 bits particulier avec un compilo très particulier pour qu'il est l'idée de mettre des int de 8 octets.

Prenons le code que tu as posté initialement, et qui est "bon" :
<hr size="2" width="100%" />int config[49];
SOCKET sock;
for(i=0;i<49;i++) config[i]=100;
...
send(sock,(char *)config,sizeof(config),0);

Sur le serveur:

int config[49];
SOCKET sock;
...
recv(sock,(char *)config,sizeof(config)*sizeof(char),0);
<hr size="2" width="100%" />
Que vaut sizeof(config) ? Bin 49 fois la taille d'un int, c'est à dire 49 * 4 = 196.
Dans le send, tu envoies sizeof(config) donc les 196 octets de ton tableau. Aucun problème.

Dans ton recv, tu récupère 19 * 4 * sizeof(char). Sachant qu'un char fait un octet, tu récupères donc là aussi 196 octets.

Donc ton code était juste. Du moins, le code que tu as posté ce fofo était juste. Mais ce n'était pas vraiment le code que tu as essayé sur ton poste, avec ton compilo.
Le code que tu as essayé, c'était ça :
<hr size="2" width="100%" />int config[49];
SOCKET sock;
for(i=0;i<49;i++) config[i]=100;
...
send(sock,(char *)config,sizeof(config),0);


Sur le serveur:

char config[49];
SOCKET sock;
...
recv(sock,(char *)config,sizeof(config)*sizeof(char),0);
<hr size ="2" width="100%" />Et oui, car que ce passe t'il avec ce code ?

Rien ne change côté send, tu envoie toujours tes 49 entiers de 4 octets -> 196 octets.

Par contre, côté recv, tu reçois sizeof(config) * sizeof(char). Donc sizeof(config) car un char prend un octet. Mais sizeof(config) ne vaut pas 196 vu que config est composé de 49 char. sizeof(config) = 49.

Donc recv lit 49 octets sur les 196. Donc tu ne lis pas toutes les données que tu as écrites. Combien en lis-tu ? Combien y a t'il d'entier valide dans 49 octets ? 49 / 4 = 12.25. Donc tu envoyait 49 octets mais n'en lisait que 12.

Par contre, ton nouveau code est tout à fait faux. Il marche peut être. Mais il est invalide.
Donc je te conseille de bien analyser la situation, de comprendre ce qu'il faut faire et de le coder. Pas faire des éssais aux hasard jusqu'à ce que ça marche.
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
13 juin 2009 à 19:20
erratum ->
Donc tu envoyait 49 octets mais n'en lisait que 12.
Donc tu envoyait 49 ints mais n'en lisait que 12.
0
Rejoignez-nous