Share via


gethostbyaddr-Funktion (winsock.h)

[gethostbyaddr wird ab Windows Sockets 2 nicht mehr für die Verwendung empfohlen. Verwenden Sie stattdessen getnameinfo.]

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

Syntax

hostent * gethostbyaddr(
  const char *addr,
  int        len,
  int        type
);

Parameter

addr

TBD

len

TBD

type

TBD

Rückgabewert

Wenn kein Fehler auftritt, gibt gethostbyaddr einen Zeiger auf die hostent-Struktur zurück. Andernfalls wird ein NULL-Zeiger zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.

Fehlercode Bedeutung
WSANOTINITIALISIERT
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen.
WSAEINVAL
Ein ungültiges Argument wurde angegeben. Dieser Fehler wird zurückgegeben, wenn AF_INET6 im Typparameter angegeben wurde und der Parameter len nicht auf die Größe einer IPv6-Adresse festgelegt wurde.
WSAENETDOWN
Fehler beim Netzwerksubsystem.
WSAHOST_NOT_FOUND
Autorisierender Antworthost nicht gefunden.
WSATRY_AGAIN
Nicht autoritativer Host nicht gefunden, oder Serverfehler.
WSANO_RECOVERY
Ein nicht behebbarer Fehler ist aufgetreten.
WSANO_DATA
Gültiger Name, kein Datensatz des angeforderten Typs.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion.
WSAEAFNOSUPPORT
Der angegebene Typ wird von der Windows Sockets-Implementierung nicht unterstützt.
WSAEFAULT
Der addr-Parameter ist kein gültiger Teil des Benutzeradressraums, oder der Parameter len ist zu klein.
WSAEINTR
Ein blockierender Windows Socket 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen.

Hinweise

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 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.

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

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

Beispielcode

Im folgenden Beispiel wird die Verwendung der gethostbyaddr-Funktion 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 ab Windows Phone 8 unterstützt.

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

Anforderungen

Anforderung Wert
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 winsock.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