Est gethostbyname garanti de retour des structures Hostent avec des adresses IPv4?
-
03-10-2019 - |
Question
Je ne peux pas utiliser getaddrinfo(...)
pour résoudre les noms d'hôtes et doit donc en tenir à gethostbyname(...)
La fonction gethostbyname(...)
garantie de renvoyer les structures Hostent qui ne contiennent que des adresses IPv4 (AF_INET) sur la réussite, de sorte que le code suivant toujours conduire à une adresse IPv4:
int resolve(const char *name, struct in_addr *addr) {
struct hostent *he = gethostbyname(name);
if (!he)
return 1;
memcpy(addr,he->h_addr_list[0],4);
return 0;
}
La solution
n, gethostbyname()
peut retourner IPV4 (de point standard) ou notation IPV6 (côlon standard, ou peut-être un point), au moins sur Linux . Vous aurez besoin de faire face à cela. Je pense que diverses mises en œuvre de ce retour ne IPV4 (par exemple PHP ), mais tous les la plate-forme C que je l'ai utilisé peut et retournera les deux.
Si votre application est IPV4 seulement, ce ne est pas trop difficile à comprendre que vous avez affaire à IPV6 et l'erreur si l'utilisateur ne dispose pas d'une interface adaptée pour se connecter à l'hôte distant. Même si votre application prend en charge à la fois, qu'est-ce que le utilisateur Prise en charge de la passerelle?
Plus de trois .
ou la présence de :
.. son IPV6.
Modifier
h_addr
est synonyme de h_addrlist_[0]
, alors que h_length
est la longueur de toutes les adresses.
Peut-être que je ne comprends pas votre question de manière adéquate?
Autres conseils
h_addrtype vous indique si h_addr_list contient IPv4 ou IPv6 ou d'autres types d'adresses. Vous pouvez utiliser un commutateur pour changer la ligne: memcpy (adr, il-> h_addr_list [0], 4); à memcpy (addr, il-> h_addr_list [0], N); où N est la longueur requise pour le type d'adresse. Par documentation MSDN, h_length est la longueur de chaque 'adresse.