IPv6 de l'analyse syntaxique en C
Je voulais savoir comment je peut analyser une adresse IPv6 dans C et de le convertir en 128 bits de la valeur?
Donc une adresse hexadécimale comme 1:22:333:aaaa:b:c:d:e
doit être convertie en 128 bits équivalent binaire. Le problème est l'adresse IP peut être de type ::2
et sa variante, car ils sont adresse IPv6 valide.
L'entrée est à partir du clavier et donc est au format ASCII.
Ce qui semble être un 144 bits de l'adresse IP que vous avez là.
Oups...Merci pour cette remarque ..en Fait je voulais dire 1:22:333:aaaa:b:c:d:e
Oups...Merci pour cette remarque ..en Fait je voulais dire 1:22:333:aaaa:b:c:d:e
OriginalL'auteur The Stig | 2010-06-03
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser POSIX
inet_pton
pour convertir une chaîne en unstruct in6_addr
.short
va faire aussi bien, aussi longtemps que la mémoire tampon est d'au moins 128 bits de longueur.Personnellement, j'aime ce qu'un peu plus de
getaddrinfo()
, à qui j'ai proposé ci-dessous. Malheureusement, il semble que Windows uniquement ainet_pton()
à partir de Vista. (Et je serais près à parier que ça n'a pas l'analyser selon la RFC 2373, et seulement votre typique adresse IPv6... quelqu'un sait?)href="http://msdn.microsoft.com/en-us/library/cc805844(SV.85).aspx" >Ce lien renvoie RFC 2553 qui déclare la fonction
inet_pton
comme une fonction qui convertit les adresses IPv4 et IPv6 représentations textuelles en forme binaire, et il dit qu'il doit accepter les adresses IPv6 dans les représentations décrites dans la section 2.2 de la RFC 2373.Merci Thanatos et dreamlax pour les réponses. Je les ai utilisés dans mon environnement Linux et il a parfaitement fonctionné.Mais le problème est que mon code où je voulais intégrer ce est une version allégée de Linux et de ne pas disposer de toutes les bibliothèques.Malheureusement, l'inet.h fichier d'en-tête n'est pas présent dans l'environnement de sorte inet_pton n'est pas pris en charge... Regarde comme je pourrais écrire ma propre fonction YeenFei souligné.. Besoin d'aide quant à la façon d'aller de l'avant sur ce sujet... Merci !! Ce qui concerne l'-TG
Parfois, il vaut la peine juste essayer ceci: déclarer les structures et les prototypes de fonction vous-même, alors il suffit d'appeler la fonction dans l'espoir que c'est dans la bibliothèque (inet_pton partie de la glibc, pas une autre bibliothèque aléatoire) malgré le votre n'ayant pas l'en-tête(s).
OriginalL'auteur dreamlax
getaddrinfo()
peuvent comprendre des adresses IPv6. Passer AF_INET6 dans les conseils, ainsi que AI_NUMERICHOST (pour éviter une recherche DNS). Linux, Windows a Windows XP.freeaddrinfo
si la fonction a réussi.OriginalL'auteur Thanatos
Pour analyser IPv6 en C, vous devez vous construire une fonction d'utilité, qui segmentées en chaîne (côlon pour hex de blocs, et de l'avant-slash pour les bits de sous-réseau).
Grâce YeenFei pour la description. Je pourrais écrire la fonction..
OriginalL'auteur YeenFei
Vous pouvez utiliser
getaddrinfo()
POSIX fonction. Il est plus souple queinet_pton()
, par exemple, il détecte automatiquement les adresses IPv4 et IPv6 formats d'adresse, il est possible de résoudre même les noms d'hôtes (à l'aide de la résolution DNS) et port/service de noms (à l'aide de/etc/services
).L'adresse IPv6 est stocké dans le
struct sockaddr_storage result
variable.OriginalL'auteur Ales Teska
Dans Windows, vous pouvez utiliser
wsastringtoaddress n'
, qui est disponible depuis Windows 2000.OriginalL'auteur Ken Bloom
Rosetta a des échantillons en plusieurs langues: https://rosettacode.org/wiki/Parse_an_IP_Address
OriginalL'auteur Fernando Gonzalez Sanchez
si vous pouvez utiliser boost, quelque chose comme cela devrait fonctionner:
C'est un peu plus portable que par exemple POSIX fonctions spécifiques.
memcpy()
lancer des exceptions?!vous avez raison, from_string (). merci pour l'avis.
OriginalL'auteur Patryk