Grâce à un article internet, je me suis lancé dans l'envoi d'un paquet IP/ICMP.
Voilà que j'ai construit (fortement inspiré du fameux article) :
J'ai deux problèmes de conversion : dans la fonction checksum
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 struct iphdr *Create_IP4(unsigned char life_time, string ip_source, string ip_dest, link_proto proto){ struct iphdr *ip; ip = (struct iphdr *)malloc(sizeof(struct iphdr)); //allocation de l'espace mémoire pour la structure ip memset(ip, 0x0, sizeof(struct iphdr)); //on initialise à zéro unsigned short ip_version = 4; unsigned short ip_len = sizeof(struct iphdr) / sizeof(unsigned long); ip->verlen = (ip_version << 4)| ip_len; ip->tos = 0; ip->tot_len = htons(sizeof(struct iphdr) + sizeof(struct icmphdr)); ip->id = 1; ip->offset = 0; ip->ttl = life_time; ip->saddr = inet_addr(ip_source.c_str()); ip->daddr = inet_addr(ip_dest.c_str()); ip->checksum = 0; if(proto == icmp){ ip->protocol = IPPROTO_ICMP; } ip->checksum = checksum((unsigned short *)ip, sizeof(struct iphdr)); return ip; } unsigned short checksum(unsigned short *buffer, int taille){ unsigned long cksum = 0; while(taille < 1){ cksum += *buffer++; taille -= sizeof(unsigned short); } if(taille) cksum += (unsigned char *)buffer; cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >> 16); return (unsigned short *)(~cksum); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part cksum += (unsigned char *)buffer;invalid conversion from `unsigned char*' to `long unsigned int'
Code : Sélectionner tout - Visualiser dans une fenêtre à part return (unsigned short *)(~cksum);Je comprends bien le problème du compilateur mais si je converti comme il veut est-ce que mon code restera valable (pas de problème de dimension lorsqu'il faudra envoyer le paquet)invalid conversion from `short unsigned int*' to `short unsigned int'
J'avoue que je ne comprends pas vraiment le code du calcul de la checksum. Si quelqu'un peux me l'expliquer en détail. (surtout le "cksum += *buffer++;" et le "(cksum >> 16) + (cksum & 0xffff);")
Je sais que c'est pas très professionnel de demander ce que fait mon propre code mais je débute avec les raw socket.
Partager