Suxyt
Messages postés2Date d'inscriptiondimanche 18 janvier 2009StatutMembreDernière intervention27 février 2010
-
25 févr. 2010 à 15:05
Suxyt
Messages postés2Date d'inscriptiondimanche 18 janvier 2009StatutMembreDernière intervention27 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 ?
katsankat
Messages postés571Date d'inscriptionvendredi 30 décembre 2005StatutMembreDernière intervention12 juillet 20123 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.
katsankat
Messages postés571Date d'inscriptionvendredi 30 décembre 2005StatutMembreDernière intervention12 juillet 20123 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/
Suxyt
Messages postés2Date d'inscriptiondimanche 18 janvier 2009StatutMembreDernière intervention27 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.