gethostbyaddr-Makro (wsipv6ok.h)

[gethostbyaddr wird ab Windows Sockets 2 nicht mehr empfohlen. Verwenden Sie stattdessen getnameinfo.]

Die gethostbyaddr-Funktion ruft die Hostinformationen ab, die einer Netzwerkadresse entsprechen.

Syntax

void gethostbyaddr(
  [in]  a,
  [in]  b,
  [in]  c
);

Parameter

[in] a

Ein Zeiger auf eine Adresse in Netzwerkbytereihenfolge.

[in] b

Die Länge der Adresse in Bytes.

[in] c

Der Typ der Adresse, z. B. der AF_INET Adressfamilientyp (verwendet mit TCP, UDP und anderen zugeordneten Internetprotokollen). Mögliche Werte für die Adressfamilie sind in der Headerdatei Winsock2.h definiert.

Im Windows SDK, das für Windows Vista und höher veröffentlicht wurde, wurde die organization der Headerdateien geändert, und die möglichen Werte für die Adressfamilie sind in der Headerdatei Ws2def.h definiert. Beachten Sie, dass die Ws2def.h-Headerdatei automatisch in Winsock2.h enthalten ist und nie direkt verwendet werden sollte.

Beachten Sie, dass die Werte für die AF_ Adressfamilie und PF_ Protokollfamilienkonstanten identisch sind (z. B. AF_INET und PF_INET), sodass beide Konstanten verwendet werden können.

In der folgenden Tabelle sind die möglichen Werte für die Adressfamilie aufgeführt, die unterstützt werden.

Wert Bedeutung
AF_INET
2
Die IPv4-Adressfamilie (Internet Protocol Version 4).
AF_NETBIOS
17
Die NetBIOS-Adressfamilie. Diese Adressfamilie wird nur unterstützt, wenn ein Windows Sockets-Anbieter für NetBIOS installiert ist.
AF_INET6
23
Die IPv6-Adressfamilie (Internet Protocol Version 6).

Rückgabewert

Keine

Bemerkungen

Die gethostbyaddr-Funktion gibt einen Zeiger auf die Hostent-Struktur zurück, der den Namen und die Adresse enthält, die der angegebenen Netzwerkadresse entsprechen.

Der Arbeitsspeicher für die hostent-Struktur , die von der gethostbyaddr-Funktion zurückgegeben wird, 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.

Obwohl gethostbyaddr nicht mehr für die Verwendung ab Windows Sockets 2 empfohlen wird und die getnameinfo-Funktion verwendet werden sollte, ist gethostbyaddr in der Lage, einen NetBIOS-Namen zurückzugeben. getnameinfo ist nicht. Entwickler, die eine NetBIOS-Namensauflösung benötigen, müssen möglicherweise gethostbyaddr verwenden, bis ihre Anwendungen völlig unabhängig von NetBIOS-Namen sind.

Hinweis Die Möglichkeit, Reverse-Lookups mithilfe der gethostbyaddr-Funktion durchzuführen, ist praktisch, aber solche Nachschlagevorgänge gelten als von Natur aus als unzuverlässig und sollten nur als Hinweis verwendet werden.
 

Beispielcode

Im folgenden Beispiel wird die Verwendung der Funktion gethostbyaddr veranschaulicht.
#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: Diese Funktion wird für Windows Phone Store-Apps auf Windows Phone 8 und höher unterstützt.

Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps unter Windows 8.1, Windows Server 2012 R2 und höher unterstützt.

Anforderungen

   
Unterstützte Mindestversion (Client) Windows 8.1, Windows Vista [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile wsipv6ok.h (einschließlich Winsock2.h, Winsock.h)
Bibliothek Ws2_32.lib
DLL Ws2_32.dll

Weitere Informationen

GetAddrInfoEx

GetAddrInfoW

WSAAsyncGetHostByAddr

Winsock-Funktionen

Winsock-Referenz

addrinfo

addrinfoW

getaddrinfo

Gethostbyname

hostent