Quel est l’équivalent Windows inet_pton ou InetPton?

Je dois déterminer si une chaîne particulière est un littéral d’adresse IPv4 ou IPv6 valide. Si je comprends bien, la bonne façon de procéder sur les systèmes POSIX consiste à utiliser inet_pton pour la convertir en une structure d’adresse réseau et voir si elle réussit. Windows Vista et versions ultérieures ont InetPton qui fait essentiellement la même chose. Mais pour autant que je sache, Windows XP ne déclare aucun de ceux-ci, et j’ai besoin de pouvoir le faire correctement sous XP. La question est donc quelle fonction système utiliser pour faire cela?

Dans le pire des cas, je peux écrire une fonction pour l’parsingr moi-même, mais je préférerais une fonction système standard, qui a donc été minutieusement testée et gère correctement tous les cas délicats et ainsi de suite. C’est déjà assez grave que Microsoft ne puisse pas déclarer inet_pton comme tout le monde et InetPton pour ses nouveaux systèmes d’exploitation.

Sous Windows XP, vous pouvez utiliser ces fonctions:

 #include  #include  #include  #include  #include  int inet_pton(int af, const char *src, void *dst) { struct sockaddr_storage ss; int size = sizeof(ss); char src_copy[INET6_ADDRSTRLEN+1]; ZeroMemory(&ss, sizeof(ss)); /* stupid non-const API */ strncpy (src_copy, src, INET6_ADDRSTRLEN+1); src_copy[INET6_ADDRSTRLEN] = 0; if (WSASsortingngToAddress(src_copy, af, NULL, (struct sockaddr *)&ss, &size) == 0) { switch(af) { case AF_INET: *(struct in_addr *)dst = ((struct sockaddr_in *)&ss)->sin_addr; return 1; case AF_INET6: *(struct in6_addr *)dst = ((struct sockaddr_in6 *)&ss)->sin6_addr; return 1; } } return 0; } const char *inet_ntop(int af, const void *src, char *dst, socklen_t size) { struct sockaddr_storage ss; unsigned long s = size; ZeroMemory(&ss, sizeof(ss)); ss.ss_family = af; switch(af) { case AF_INET: ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src; break; case AF_INET6: ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src; break; default: return NULL; } /* cannot direclty use &size because of ssortingct aliasing rules */ return (WSAAddressToSsortingng((struct sockaddr *)&ss, sizeof(ss), NULL, dst, &s) == 0)? dst : NULL; } 

C’est tout. Lien avec la bibliothèque ws2_32.

Mais pour autant que je sache, Windows XP ne déclare aucun de ceux-ci, et j’ai besoin de pouvoir le faire correctement sous XP.

La documentation InetPton énonce les exigences suivantes:

  • Client minimum pris en charge: Windows Vista [applications de bureau uniquement]
  • Serveur minimum pris en charge: Windows Server 2008 [applications de bureau uniquement]

Dans le pire des cas, je peux écrire une fonction pour l’parsingr moi-même, mais je préférerais une fonction système standard, qui a donc été minutieusement testée et gère correctement tous les cas délicats et ainsi de suite.

Pourquoi ne pas utiliser une partie du code de l’outil réseau OSS Wireshark ?

Vous pouvez trouver leur réimplémentation de inet_pton dans leur référentiel de code source .

La licence (voir ci-dessous) est très permissive, cela peut donc être une bonne alternative.

L’autorisation d’utiliser, de copier, de modifier et de dissortingbuer ce logiciel à quelque fin que ce soit, avec ou sans frais, est par les présentes accordée, à condition que la notification de copyright ci-dessus et la présente notification d’autorisation apparaissent sur toutes les copies.

En parcourant les fichiers d’en-tête du SDK, je trouve inet_pton() déclaré dans “c: \ Program Files \ Microsoft SDK \ Windows \ v7.1 \ Include \ WS2tcpip.h”. InetPton n’est qu’un #define à cela.

Il semble donc que MS fournit la bonne interface, mais seulement à partir de Vista. Mais XP n’a pas de support IPv6 qui mérite d’être mentionné, si je me souviens bien.

L’autre option consiste à le boucler vous-même avec deux appels à WSAAddressToSsortingng() , un avec AF_INET , un avec AF_INET6 . Je suppose que les docs n’ont pas essayé.