Share via


HOSTENT-Struktur (winsock2.h)

Die Hostentstruktur wird von Funktionen verwendet, um Informationen zu einem bestimmten Host zu speichern, z. B. Hostname, IPv4-Adresse usw. Eine Anwendung sollte niemals versuchen, diese Struktur zu ändern oder ihre Komponenten frei zu geben. Darüber hinaus wird nur eine Kopie der Hostentstruktur pro Thread zugeordnet, und eine Anwendung sollte daher alle Informationen kopieren, die sie benötigt, bevor sie andere Windows Sockets-API-Aufrufe ausgibt.

Syntax

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

Member

h_name

Der offizielle Name des Hosts (PC). Wenn Sie das DNS oder ein ähnliches Auflösungssystem verwenden, ist es der vollqualifizierte Domänenname (Fully Qualified Domain Name, FQDN), der den Server dazu veranlasst hat, eine Antwort zurückzugeben. Bei Verwendung einer lokalen Hostdatei ist dies der erste Eintrag nach der IPv4-Adresse.

h_aliases

Ein NULL-beendetes Array mit alternativen Namen.

h_addrtype

Der Typ der zurückgegebenen Adresse.

h_length

Die Länge der einzelnen Adressen in Bytes.

h_addr_list

Eine NULL-beendete Liste von Adressen für den Host. Adressen werden in Netzwerkbytereihenfolge zurückgegeben. Das Makro h_addr ist für die Kompatibilität mit älteren Software definiert h_addr_list[0] .

Hinweise

Die Funktionen gethostbyaddr und gethostbyname geben einen Zeiger auf eine Hostentstruktur zurück– eine Struktur, die von Windows Sockets zugewiesen wird. Die Hostentstruktur enthält die Ergebnisse einer erfolgreichen Suche nach dem host, der im name-Parameter angegeben ist.

Der Von den Funktionen gethostbyaddr und gethostbyname zurückgegebene Arbeitsspeicher für die Hostentstruktur wird intern von der Winsock-DLL aus lokalem Threadspeicher zugeordnet. Es wird nur eine einzelne Hostentstruktur zugeordnet und verwendet, unabhängig davon, wie oft die Funktionen gethostbyaddr oder gethostbyname im Thread aufgerufen werden. Die zurückgegebene Hostentstruktur muss in einen Anwendungspuffer kopiert werden, wenn zusätzliche Aufrufe für die Funktionen gethostbyaddr oder gethostbyname im selben Thread ausgeführt werden sollen. Andernfalls wird der Rückgabewert durch nachfolgende aufrufe gethostbyaddr oder gethostbyname im selben Thread überschrieben. Der für die zurückgegebene Hostentstruktur zugewiesene interne Arbeitsspeicher wird von der Winsock-DLL freigegeben, wenn der Thread beendet wird.

Eine Anwendung sollte nicht versuchen, den von der zurückgegebenen Hostentstruktur verwendeten Arbeitsspeicher freizugeben. Die Anwendung darf niemals versuchen, diese Struktur zu ändern oder ihre Komponenten frei zu geben. Darüber hinaus wird nur eine Kopie dieser Struktur pro Thread zugewiesen, sodass die Anwendung alle benötigten Informationen kopieren sollte, bevor sie andere Funktionsaufrufe für gethostbyaddr oder gethostbyname ausgibt.

Beispiele

In den folgenden Beispielen wird die Verwendung der Hostent-Struktur mit der Gethostbyname-Funktion veranschaulicht.

#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;
}

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 2000 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [nur Desktop-Apps]
Kopfzeile winsock2.h (einschließlich Winsock2.h)

Weitere Informationen

GetAddrInfoEx

GetAddrInfoW

addrinfo

addrinfoW

getaddrinfo

gethostbyaddr

Gethostbyname