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;
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top