Partager via


Structure HOSTENT (winsock2.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 hostente 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 renvoi 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 d’autres noms terminés par NULL.

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 d’octet du 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 Windows Sockets. 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 hostente 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 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.

Exemples

Les exemples suivants illustrent l’utilisation de la structure hostente 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

   
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 winsock2.h (inclure Winsock2.h)

Voir aussi

GetAddrInfoEx

GetAddrInfoW

addrinfo

addrinfoW

getaddrinfo

gethostbyaddr

gethostbyname