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"