Gethostbyaddr, fonction (winsock.h)

[gethostbyaddr n’est plus recommandé à partir de Windows Sockets 2. Utilisez plutôt getnameinfo.]

La fonction gethostbyaddr récupère les informations de l’hôte correspondant à une adresse réseau.

Syntaxe

hostent * gethostbyaddr(
  const char *addr,
  int        len,
  int        type
);

Paramètres

addr

TBD

len

TBD

type

TBD

Valeur retournée

Si aucune erreur ne se produit, gethostbyaddr retourne un pointeur vers la structure hostent . Sinon, elle retourne un pointeur Null et un code d’erreur spécifique peut être récupéré en appelant WSAGetLastError.

Code d'erreur Signification
WSANOTINITIALISED
Un appel WSAStartup réussi doit se produire avant d’utiliser cette fonction.
WSAEINVAL
Argument non valide fourni. Cette erreur est retournée si AF_INET6 a été spécifié dans le paramètre type et que le paramètre len n’a pas été défini sur la taille d’une adresse IPv6.
WSAENETDOWN
Le sous-système réseau a échoué.
WSAHOST_NOT_FOUND
Hôte de réponse faisant autorité introuvable.
WSATRY_AGAIN
Hôte non authentifié introuvable ou serveur défaillant.
WSANO_RECOVERY
Une erreur non récupérable s’est produite.
WSANO_DATA
Nom valide, aucun enregistrement de données de type demandé.
WSAEINPROGRESS
Un appel Windows Sockets 1.1 bloquant est en cours ou le fournisseur de services traite toujours une fonction de rappel.
WSAEAFNOSUPPORT
Le type spécifié n’est pas pris en charge par l’implémentation Windows Sockets.
WSAEFAULT
Le paramètre addr n’est pas une partie valide de l’espace d’adressage utilisateur, ou le paramètre len est trop petit.
WSAEINTR
Un appel Windows Socket 1.1 bloquant a été annulé via WSACancelBlockingCall.

Remarques

La fonction gethostbyaddr retourne un pointeur vers la structure hostent qui contient le nom et l’adresse correspondant à l’adresse réseau donnée.

La mémoire de la structure hostente retournée par la fonction gethostbyaddr est allouée en interne par la DLL Winsock à partir du stockage local des threads. Une seule structure hostente est allouée et utilisée, quel que soit le nombre d’appel des fonctions gethostbyaddr ou gethostbyname sur le thread. La structure hostent retournée doit être copiée dans une mémoire tampon d’application si des appels supplémentaires doivent être effectués vers les fonctions gethostbyaddr ou gethostbyname sur le même thread. Sinon, la valeur de retour sera remplacée par les appels gethostbyaddr ou gethostbyname suivants sur le même thread. La mémoire interne allouée à la structure hostente retournée est libérée par la DLL Winsock lorsque le thread se ferme.

Une application ne doit pas essayer de libérer la mémoire utilisée par la structure hostente retournée. L’application ne doit jamais tenter de modifier cette structure ou de libérer aucun de ses composants. En outre, une seule copie de cette structure étant allouée par thread, l’application doit copier toutes les informations dont elle a besoin avant d’émettre d’autres appels de fonction à gethostbyaddr ou gethostbyname.

Bien que l’utilisation de gethostbyaddr ne soit plus recommandée depuis Windows Sockets 2 et que la fonction getnameinfo soit utilisée, gethostbyaddr est capable de retourner un nom NetBIOS ; getnameinfo n’est pas. Les développeurs nécessitant la résolution de noms NetBIOS peuvent avoir besoin d’utiliser gethostbyaddr jusqu’à ce que leurs applications soient complètement indépendantes des noms NetBIOS.

Note La possibilité d’effectuer des recherches inversées à l’aide de la fonction gethostbyaddr est pratique, mais ces recherches sont considérées comme intrinsèquement peu fiables et ne doivent être utilisées qu’à titre d’indicateur.
 

Exemple de code

L’exemple suivant illustre l’utilisation de la fonction gethostbyaddr .
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

int main(int argc, char **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData;
    int iResult;

    DWORD dwError;
    int i = 0;
    int bIpv6 = 0;

    struct hostent *remoteHost;
    char *host_addr;
    struct in_addr addr = { 0 };
    IN6_ADDR addr6;

    char **pAlias;

    // Validate the parameters
    if (argc < 2) {
        printf("usage: %s 4 ipv4address\n", argv[0]);
        printf(" or\n");
        printf("usage: %s 6 ipv6address\n", argv[0]);
        printf("  to return the hostname\n");
        printf("       %s 4 127.0.0.1\n", argv[0]);
        printf("       %s 6 0::1\n", argv[0]);
        return 1;
    }
    // Validate parameters 
    if (atoi(argv[1]) == 4)
        bIpv6 = 0;
    else if (atoi(argv[1]) == 6)
        bIpv6 = 1;
    else {
        printf("usage: %s 4 ipv4address\n", argv[0]);
        printf(" or\n");
        printf("usage: %s 6 ipv6address\n", argv[0]);
        printf("  to return the hostname\n");
        printf("       %s 4 127.0.0.1\n", argv[0]);
        printf("       %s 6 0::1\n", argv[0]);
        return 1;
    }

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

    host_addr = argv[2];

    printf("Calling gethostbyaddr with %s\n", host_addr);
    if (bIpv6 == 1) {
        {
            iResult = inet_pton(AF_INET6, host_addr, &addr6);
            if (iResult == 0) {
                printf("The IPv6 address entered must be a legal address\n");
                return 1;
            } else
                remoteHost = gethostbyaddr((char *) &addr6, 16, AF_INET6);
        }
    } else {
        addr.s_addr = inet_addr(host_addr);
        if (addr.s_addr == INADDR_NONE) {
            printf("The IPv4 address entered must be a legal address\n");
            return 1;
        } else
            remoteHost = gethostbyaddr((char *) &addr, 4, AF_INET);
    }

    if (remoteHost == NULL) {
        dwError = WSAGetLastError();
        if (dwError != 0) {
            if (dwError == WSAHOST_NOT_FOUND) {
                printf("Host not found\n");
                return 1;
            } else if (dwError == WSANO_DATA) {
                printf("No data record found\n");
                return 1;
            } else {
                printf("Function failed with error: %ld\n", dwError);
                return 1;
            }
        }
    } else {
        printf("Function returned:\n");
        printf("\tOfficial name: %s\n", remoteHost->h_name);
        for (pAlias = remoteHost->h_aliases; *pAlias != 0; pAlias++) {
            printf("\tAlternate name #%d: %s\n", ++i, *pAlias);
        }
        printf("\tAddress type: ");
        switch (remoteHost->h_addrtype) {
        case AF_INET:
            printf("AF_INET\n");
            break;
        case AF_INET6:
            printf("AF_INET6\n");
            break;
        case AF_NETBIOS:
            printf("AF_NETBIOS\n");
            break;
        default:
            printf(" %d\n", remoteHost->h_addrtype);
            break;
        }
        printf("\tAddress length: %d\n", remoteHost->h_length);

        if (remoteHost->h_addrtype == AF_INET) {
            while (remoteHost->h_addr_list[i] != 0) {
                addr.s_addr = *(u_long *) remoteHost->h_addr_list[i++];
                printf("\tIPv4 Address #%d: %s\n", i, inet_ntoa(addr));
            }
        } else if (remoteHost->h_addrtype == AF_INET6)
            printf("\tRemotehost is an IPv6 address\n");
    }

    return 0;
}

Windows Phone 8 : cette fonction est prise en charge pour les applications Windows Phone Store sur Windows Phone 8 et versions ultérieures.

Windows 8.1 et Windows Server 2012 R2 : cette fonction est prise en charge pour les applications du Windows Store sur Windows 8.1, Windows Server 2012 R2 et versions ultérieures.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 8.1, Windows Vista [applications de bureau | Applications UWP]
Serveur minimal pris en charge Windows Server 2003 [applications de bureau | applications UWP]
Plateforme cible Windows
En-tête winsock.h (inclure Winsock2.h, Winsock.h)
Bibliothèque Ws2_32.lib
DLL Ws2_32.dll

Voir aussi

GetAddrInfoEx

GetAddrInfoW

WSAsyncGetHostByAddr

Winsock Functions

Référence Winsock

addrinfo

addrinfoW

getaddrinfo

gethostbyname

hostent