Sockets

Suxyt Messages postés 2 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 27 février 2010 - 25 févr. 2010 à 15:05
Suxyt Messages postés 2 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 27 février 2010 - 27 févr. 2010 à 10:58
Bonjour à tous,

Actuellement, je travaille sur un projet qui consiste d'envoyer et de recevoir des données en construisant l'en-tête soi-même. Pour effectuer ceci, j'ai effectué des sockets RAW en udp.

Donc mon programme de sockets, j'ai défini de cette manière:

**********Fonction Calcul Checksum**************

**********Programme Principal**********
Déclaration de mes variables + celui du buffer

Ci-dessous, je place au niveau de mon buffer ou se trouve chaque champ c'est-à-dire IP|UDP|Data
struct ip *ip = (struct ip *) buffer;
struct udphdr *udp = (struct udphdr *) (buffer + sizeof(struct ip));
data=(char *)(buffer+sizeof(struct ip)+sizeof(struct udphdr));
strcpy(data, "abd");

Création de la socket
s = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
Ensuite je mets les memset pour la source et la destination
Attachement de la socket par le bind

Assignation des valeurs pour ip et udp

Envoi de la trame par un sendto

******************Fin du programme****************


Lorsque je fais mon programme de cette manière cela fonctionne à merveille, j'envoi bien le mot abd et il est bien reçu sur mon serveur. J'ai même pu d'ailleurs vérifier avec tcpdump voire même wireshark si la donnée allait bien du client au serveur ce qui est le cas.

Mon problème actuel c'est que je souhaite envoyer plusieurs valeurs qui sont retournées par des fonctions spécifiques qui me retournent un entier et que je veux intégrer à ma donnée.
Pour faire ceci, j'ai créer une structure ou se trouve 3 variables:

struct data{
int a;
int b;
int c;
};

Ensuite à la place de la partie data=(char *)(buffer+sizeof(struct ip)+sizeof(struct udphdr)) et strcpy(data,"abd"), je les ai remplacé par:
struct data * data;
data=(struct data *)(buffer+sizeof(struct ip)+sizeof(struct udphdr));
data->a=0x12;
data->b=0x23;
data->c=0x34;

La valeur de ses variables sont 0x12 car si je mettais juste 12 alors dans l'en-tête, on ne voit pas cette valeur d'ou la raison de l'héxa ici.

Lorsque j'envoi, mon serveur ne reçoit rien alors qu'il recevait à merveille auparavant.

Auriez vous une suggestion sur l'erreur que j'ai commise ?

Merci de me répondre.
A bientôt.

3 réponses

katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
27 févr. 2010 à 06:35
Salut tu ne peux pas envoyer d'entier tel quel -enfin si, mais attention à deux choses :
1) l'indien, quel est le bit significatif? Ca dépend de l'architecture du processeur, voir hton().
2) De plus, le compilateur pourrait ordonner la structure différemment en mémoire ainsi celui qui reçoit ne décoderait pas dans le même ordre (quoi que dans ton cas trois int ne changeront rien, par contre un char* et deux int pourraient se voir intervertis par le compilateur: les int d'abord et le char* ensuite).

Sinon plus simple il faut sérialiser les données de la structure: passer la structure dans un buffer en regroupant chaque membre de la structure en un seul buffer avec sprintf() côté envoyeur, et invoquer scanf() chez celui qui reçoit. Une succession d'atoi()/itoa() le ferait aussi.
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
27 févr. 2010 à 06:39
J'avais oublié, quand tu fais data->a=0x12; ça envoie le caractère ASCII numéro 18 (12 en hexa), qui n'est pas imprimable, alors que 'a' oui (0x61)
http://www.table-ascii.com/
0
Suxyt Messages postés 2 Date d'inscription dimanche 18 janvier 2009 Statut Membre Dernière intervention 27 février 2010
27 févr. 2010 à 10:58
Bonjour et merci de ta réponse.

Au sujet de la structure c'était juste un exemple, j'assigne une valeur quelconque à ma variable 'a'. Le code ascii ne rentre pas en compte la dedans.

Sinon au sujet du sprintf et du sscanf, serait-il possible que tu me montres un exemple qui me permette de comprendre correctement car je reste tout de même novice dans ce domaine. Aussi pour les itoa() et atoi() s'il te plait.

Merci de répondre.
A bientôt.
0