détecter une adresse IPv6 temporaire sur la plateforme croisée

Je veux détecter si une adresse est une adresse IPv6 temporaire, j’utilise getifaddrs pour obtenir la liste des adresses, mais je ne sais pas comment obtenir ces informations à partir de là. Et si possible, je veux que cela fonctionne pour Linux, OSX, Solaris et Windows.

Il me semble que sous Linux, IFA_F_TEMPORARY est défini dans inet6_ifaddr-> ifa_flags, mais je ne suis pas sûr de savoir comment puis-je l’obtenir des ifaddrs renvoyés par getifaddrs.

On dirait que sous OSX, j’ai besoin d’octl avec SIOCSIFINFO_FLAGS et je n’ai aucune idée de Solaris ou de Windows.

a tout corps un exemple de code qui pourrait le faire.

Mis à jour (3 août 2016): Après des recherches fréquentes ces deux derniers mois sur cette question (car j’ai moi-même besoin de cette réponse). Je pense avoir trouvé la réponse centrée sur Windows. Je n’ai testé cela que sur Windows 10, donc je ne connais pas les anciennes versions. Mais cette API n’aurait pas dû changer si quelqu’un voulait la vérifier pour moi 🙂

Toutes les structures _IP_ADAPTER_UNICAST_ADDRESS ont une énumération pour le préfixe et le suffixe d’adresse. Je me suis donné la peine de les regarder et ils sont la clé de la résolution de ce problème!

Qu’est-ce qu’une adresse IPv6 temporaire …. c’est une adresse avec un suffixe aléatoire! Donc, pour toutes les adresses IPv6 dans un IP_ADAPTER_UNICAST_ADDRESS, regardez IP_SUFFIX_ORIGIN pour voir s’il s’agit de IpSuffixOriginRandom . C’est tout.

Je suis encore très choqué par le peu de choses qui sont en ligne sur ce sujet. Ce sera un gros problème dans quelques années pour les développeurs d’applications réseau si personne ne sait comment résoudre ce problème pour les applications côté serveur (même celles fonctionnant sur des PC grand public). )

Vous avez entendu la réponse ici d’abord !!!


(Réponse originale): J’ai également examiné ce sujet pour une application multiplate-forme. Je pense avoir trouvé “un” moyen de filtrer les adresses temporaires IPv6 dans Windows. Fondamentalement, RFC 4941, les adresses temporaires doivent:

  1. Avoir une durée de vie valide inférieure à l’adresse “publique”
  2. Avoir une durée de vie préférée inférieure à l’adresse “publique”

Ainsi, pour C ++, lorsque vous utilisez une fonction telle que GetAdaptersAddresses, vous pouvez rechercher dans la structure PIP_ADAPTER_ADDRESSES la structure _IP_ADAPTER_UNICAST_ADDRESS et évaluer les membres ValidLifetime et PreferredLifetime. Après filtrage par type d’adresse (si vous devez connaître Local-Link vs Public), vous pouvez conserver un décompte de la durée de vie la plus longue. L’adresse publique doit être la durée de vie la plus longue (par adaptateur)!

Pour voir les informations de durée de vie d’adresse, exécutez rapidement la commande de terminal Windows: netsh interface ipv6 show address

Vous pouvez voir que toutes les adresses temporaires sont beaucoup plus petites que les durées de vie SLAAC par défaut.

Je travaille avec cette hypothèse pour l’instant jusqu’à ce que les tests prouvent le contraire. Toutes les adresses temporaires sont basées sur le public et ne peuvent donc pas le vivre.

J’espère que cela t’aides