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 |
---|---|
Debe producirse una llamada de WSAStartup correcta antes de usar esta función. | |
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. | |
Error en el subsistema de red. | |
No se encontró el host de respuesta autoritativo. | |
No se encontró el host no autenticado o se produjo un error en el servidor. | |
Error irrecuperable. | |
Nombre válido, sin registro de datos del tipo solicitado. | |
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. | |
La implementación de Windows Sockets no admite el tipo especificado. | |
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. | |
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.
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 |