Bonjour,
Je suis en train d'essayer de réaliser un petit programme qui envoie une trame ICMP echo, donc à l'aide du protocole IP. Je travail en RW :
note:
SOCKET monSocket;
sockaddr_in sockaddrIn;
icmphdr headerIcmp;
char icmpMessage[50];
int m_sockfd;
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 SOCKET mon_soket = socket(AF_INET, SOCK_RAW ,IPPROTO_ICMP); sockaddrIn.sin_family = AF_INET; inet_aton("192.168.255.153", &sockaddrIn.sin_addr); headerIcmp.type = ICMP_ECHO; headerIcmp.code = 0; headerIcmp.checksum; bind(mon_soket,(const sockaddr*)&sockaddrIn,sizeof(sockaddrIn)); sendto(mon_soket,&headerIcmp,sizeof(icmphdr),0,(const sockaddr*)&sockaddrIn,sizeof(sockaddrIn)); memset(icmpMessage, 'X', sizeof(icmpMessage)); recv(mon_soket, icmpMessage, sizeof(icmpMessage),0); close(mon_soket);
Avec Wireshark j'observe :
Type 8
Code 0
Checksum 0xca28 Incorrect, shloud be 0xccbf
Identifier (BE) : 16639 (0x40ff)
Identifier (LE) : 65344 (0xff40)
Sequence number (BE) 59968 (0xea40)
Sequence number (LE) 16618 (0x40ea)
No Response Seen
Bref, je n'ai pas réglé le checksum dans mon programme.
Ce que j'en sais, c'est que sa logique ressemble à cette phrase :
So, as far as the algorithm goes, IP header checksum is : 16 bit one’s complement of the one’s complement sum of all 16 bit words in the header
J'aurais aimé savoir :
* si je dois passer par une méthode artisanal de calcul du checksum, ou s'il existe une méthode système qui fait sa proprement ?
* Le résultat final est il bien... la Somme des compléments de l'entête divisé en 16mots ? (Je découpe l'entête en 16mots, et j'additionne tous les compléments ?)
Voilà, c'est pas gagné, mais j’espère avancer tout doucement
Bon code !
EDIT : Il s'agit donc du "Complément à 1 de la somme des complément à 1 sur 16 bits"![]()
Partager