Partager via


Structure HOSTENT (winsock.h)

La structure hostent est utilisée par les fonctions pour stocker des informations sur un hôte donné, telles que le nom d’hôte, l’adresse IPv4, etc. Une application ne doit jamais tenter de modifier cette structure ou de libérer aucun de ses composants. En outre, une seule copie de la structure de l’hôte est allouée par thread, et une application doit donc copier toutes les informations dont elle a besoin avant d’émettre d’autres appels d’API Windows Sockets.

Syntaxe

typedef struct hostent {
  char  *h_name;
  char  **h_aliases;
  short h_addrtype;
  short h_length;
  char  **h_addr_list;
} HOSTENT, *PHOSTENT, *LPHOSTENT;

Membres

h_name

Nom officiel de l’hôte (PC). Si vous utilisez le DNS ou un système de résolution similaire, c’est le nom de domaine complet (FQDN) qui a provoqué le retour d’une réponse par le serveur. Si vous utilisez un fichier hosts local, il s’agit de la première entrée après l’adresse IPv4.

h_aliases

Tableau null de noms de remplacement.

h_addrtype

Type d’adresse retournée.

h_length

Longueur, en octets, de chaque adresse.

h_addr_list

Liste d’adresses terminées par null pour l’hôte. Les adresses sont retournées dans l’ordre des octets réseau. La macro h_addr est définie pour être h_addr_list[0] compatible avec les logiciels plus anciens.

Remarques

Les fonctions gethostbyaddr et gethostbyname retournent un pointeur vers une structure hôte , une structure allouée par les sockets Windows. La structure hostent contient les résultats d’une recherche réussie pour l’hôte spécifié dans le paramètre name .

La mémoire de la structure d’hôte retournée par les fonctions gethostbyaddr et gethostbyname est allouée en interne par la DLL Winsock à partir du stockage local du thread. Une seule structure d’hôte est allouée et utilisée, quel que soit le nombre de fois où les fonctions gethostbyaddr ou gethostbyname sont appelées sur le thread. La structure d’hôte retournée doit être copiée dans une mémoire tampon d’application si des appels supplémentaires doivent être effectués aux 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 pour la structure d’hôte retournée est libérée par la DLL Winsock à la sortie du thread.

Une application ne doit pas essayer de libérer la mémoire utilisée par la structure hôte 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.

Exemples

Les exemples suivants illustrent l’utilisation de la structure hostent avec la fonction gethostbyname .

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")

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

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

    DWORD dwError;
    int i = 0;

    struct hostent *remoteHost;
    char *host_name;
    struct in_addr addr;

    char **pAlias;

    // Validate the parameters
    if (argc != 2) {
        printf("usage: %s ipv4address\n", argv[0]);
        printf(" or\n");
        printf("       %s hostname\n", argv[0]);
        printf("  to return the host\n");
        printf("       %s 127.0.0.1\n", argv[0]);
        printf("  to return the IP addresses for a host\n");
        printf("       %s www.contoso.com\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_name = argv[1];

// If the user input is an alpha name for the host, use gethostbyname()
// If not, get host by addr (assume IPv4)
    if (isalpha(host_name[0])) {        /* host address is a name */
        printf("Calling gethostbyname with %s\n", host_name);
        remoteHost = gethostbyname(host_name);
    } else {
        printf("Calling gethostbyaddr with %s\n", host_name);
        addr.s_addr = inet_addr(host_name);
        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;
}

Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
En-tête winsock.h (inclure Winsock2.h)

Voir aussi

GetAddrInfoEx

GetAddrInfoW

addrinfo

addrinfoW

getaddrinfo

gethostbyaddr

gethostbyname