PI Services

Le blog des collaborateurs de PI Services

Réseau – L’adresse résolue par PING n’est pas celle attendue !

Beaucoup de programmes TCP/IP comme Ping et FTP utilisent la fonction WinSock INET_ADDR() :

unsigned long inet_addr( __in const char *cp );

pour convertir les adresses IPv4 du format chaine de caractère avec séparateur ”.” dans un format IN_ADDR qui n’est qu’une structure.

typedef struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un; } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

Toute adresse IPv4 sera formatée dans cette structure sous le format d’un entier long non signé (u_long).

La fonction INET_ADDR accepte les chaines de caractères au format suivant :

  • a.b.c.d
  • a.b.c
  • a.b
  • a
    Les différentes parties qui définissent l’adresse IP dans son format caractère avec séparateur “.” peuvent avoir des valeurs décimales , octales ou hexadécimales.

Ainsi pinger l’adresse 172.19.0.40 revient à pinger  l’adresse 0254.023.0.050 en octal et l’adresse 0xAC.0x13.0.0x28 en hexadécimal.

172.19.0.40

image

0254.023.0.050

image

0xAC.0x13.0.0x28

image

Lors du traitement de la chaine de caractère en entrée, la fonction INET_ADDR traitera les nombre selon les règles suivantes :

  • Tout nombre commençant par  0x ou 0X sera traité comme un chiffre hexadécimal
  • Tout nombre commençant par 0 sera traité comme étant un nombre octal
  • Les autres cas seront traité comme des nombres décimaux.

Ainsi il faut faire attention à ne pas utiliser un Zéro à gauche au niveau d’une partie de l’adresse IP si vous voulez la pinger car la partie qui commence par zéro sera traité comme étant un nombre octal et le Ping sera dirigé vers une autre adresse qui ne correspond pas à celle que vous avez tapé.