Freigeben über


HOSTENT-Struktur (winsock.h)

Die Hostent-Struktur 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 Hostent-Struktur pro Thread zugeordnet, und eine Anwendung sollte daher alle Informationen kopieren, die sie vor dem Ausgeben anderer Windows Sockets-API-Aufrufe benötigt.

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 dazu geführt hat, dass der Server eine Antwort zurückgibt. Wenn Sie eine lokale Hostdatei verwenden, ist dies der erste Eintrag nach der IPv4-Adresse.

h_aliases

Ein NULL-beendetes Array von alternativen Namen.

h_addrtype

Der Typ der zurückgegebenen Adresse.

h_length

Die Länge der einzelnen Adressen in Bytes.

h_addr_list

Eine MIT NULL beendete Liste von Adressen für den Host. Adressen werden in Netzwerkbytereihenfolge zurückgegeben. Das Makro h_addr ist aus Gründen der h_addr_list[0] Kompatibilität mit älterer Software definiert.

Hinweise

Die Funktionen gethostbyaddr und gethostbyname geben einen Zeiger auf eine Hostentstruktur zurück– eine struktur, die von Windows Sockets zugeordnet wird. Die hostent-Struktur enthält die Ergebnisse einer erfolgreichen Suche nach dem im name-Parameter angegebenen Host.

Der Arbeitsspeicher für die hostent-Struktur , die von den Funktionen gethostbyaddr und gethostbyname zurückgegeben wird, wird intern von der Winsock-DLL aus dem lokalen Threadspeicher zugeordnet. Es wird nur eine einzelne hostent-Struktur zugeordnet und verwendet, unabhängig davon, wie oft die Funktionen gethostbyaddr oder gethostbyname im Thread aufgerufen werden. Die zurückgegebene hostent-Struktur muss in einen Anwendungspuffer kopiert werden, wenn zusätzliche Aufrufe an die Funktionen gethostbyaddr oder gethostbyname im selben Thread erfolgen sollen. Andernfalls wird der Rückgabewert von nachfolgenden gethostbyaddr - oder gethostbyname-Aufrufen im selben Thread überschrieben. Der für die zurückgegebene Hostent-Struktur zugeordnete interne Speicher wird von der Winsock-DLL freigegeben, wenn der Thread beendet wird.

Eine Anwendung sollte nicht versuchen, den von der zurückgegebenen Hostent-Struktur verwendeten Arbeitsspeicher freizugeben. Die Anwendung darf niemals versuchen, diese Struktur zu ändern oder ihre Komponenten frei zu geben. Darüber hinaus wird pro Thread nur eine Kopie dieser Struktur zugeordnet, 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

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 2000 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [nur Desktop-Apps]
Kopfzeile winsock.h (Winsock2.h einschließen)

Weitere Informationen

GetAddrInfoEx

GetAddrInfoW

addrinfo

addrinfoW

getaddrinfo

gethostbyaddr

Gethostbyname