Función gethostbyaddr (winsock.h)

[gethostbyaddr ya no se recomienda para su uso a partir de Windows Sockets 2. En su lugar, use getnameinfo.]

La función gethostbyaddr recupera la información del host correspondiente a una dirección de red.

Sintaxis

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

Parámetros

addr

TBD

len

TBD

type

TBD

Valor devuelto

Si no se produce ningún error, gethostbyaddr devuelve un puntero a la estructura del host . De lo contrario, devuelve un puntero nulo y se puede recuperar un código de error específico mediante una llamada a WSAGetLastError.

Código de error Significado
WSANOTINITIALISED
Debe producirse una llamada de WSAStartup correcta antes de usar esta función.
WSAEINVAL
Se ha proporcionado un argumento no válido. Este error se devuelve si AF_INET6 se especificó en el parámetro type y el parámetro len no se estableció igual al tamaño de una dirección IPv6.
WSAENETDOWN
Error en el subsistema de red.
WSAHOST_NOT_FOUND
No se encontró el host de respuesta autoritativo.
WSATRY_AGAIN
No se encontró el host no autenticado o se produjo un error en el servidor.
WSANO_RECOVERY
Error irrecuperable.
WSANO_DATA
Nombre válido, sin registro de datos del tipo solicitado.
WSAEINPROGRESS
Una llamada de Bloqueo de Windows Sockets 1.1 está en curso o el proveedor de servicios sigue procesando una función de devolución de llamada.
WSAEAFNOSUPPORT
La implementación de Windows Sockets no admite el tipo especificado.
WSAEFAULT
El parámetro addr no es una parte válida del espacio de direcciones del usuario o el parámetro len es demasiado pequeño.
WSAEINTR
Se canceló una llamada de Bloqueo de Windows Socket 1.1 a través de WSACancelBlockingCall.

Comentarios

La función gethostbyaddr devuelve un puntero a la estructura del host que contiene el nombre y la dirección correspondientes a la dirección de red especificada.

La memoria de la estructura hostent devuelta por la función gethostbyaddr se asigna internamente mediante el archivo DLL winsock desde el almacenamiento local del subproceso. Solo se asigna y usa una única estructura de host , independientemente de cuántas veces se llamen a las funciones gethostbyaddr o gethostbyname en el subproceso. La estructura de host devuelta debe copiarse en un búfer de aplicación si se van a realizar llamadas adicionales a las funciones gethostbyaddr o gethostbyname en el mismo subproceso. De lo contrario, el valor devuelto se sobrescribirá mediante llamadas gethostbyaddr o gethostbyname posteriores en el mismo subproceso. La memoria interna asignada para la estructura de host devuelta se libera mediante la DLL winsock cuando se cierra el subproceso.

Una aplicación no debe intentar liberar la memoria usada por la estructura hostent devuelta. La aplicación nunca debe intentar modificar esta estructura o liberar cualquiera de sus componentes. Además, solo se asigna una copia de esta estructura por subproceso, por lo que la aplicación debe copiar cualquier información que necesite antes de emitir cualquier otra llamada de función a gethostbyaddr o gethostbyname.

Aunque gethostbyaddr ya no se recomienda para su uso a partir de Windows Sockets 2 y se debe usar la función getnameinfo , gethostbyaddr es capaz de devolver un nombre NetBIOS; getnameinfo no es. Es posible que los desarrolladores que requieran la resolución de nombres NetBIOS necesiten usar gethostbyaddr hasta que sus aplicaciones sean completamente independientes de los nombres netBIOS.

Nota La capacidad de realizar búsquedas inversas mediante la función gethostbyaddr es conveniente, pero estas búsquedas se consideran intrínsecamente poco confiables y solo se deben usar como sugerencia.
 

Código de ejemplo

En el ejemplo siguiente se muestra el uso de la función gethostbyaddr .
#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: esta función es compatible con las aplicaciones de Windows Phone Store en Windows Phone 8 y versiones posteriores.

Windows 8.1 y Windows Server 2012 R2: esta función es compatible con las aplicaciones de la Tienda Windows en Windows 8.1, Windows Server 2012 R2 y versiones posteriores.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 8.1, Windows Vista [aplicaciones de escritorio | Aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado winsock.h (incluya Winsock2.h, Winsock.h)
Library Ws2_32.lib
Archivo DLL Ws2_32.dll

Consulte también

GetAddrInfoEx

GetAddrInfoW

WSAAsyncGetHostByAddr

Funciones winsock

Referencia de Winsock

addrinfo

addrinfoW

getaddrinfo

gethostbyname

hostent