Função gethostbyaddr (winsock.h)
[gethostbyaddr não é mais recomendado para uso a partir do Windows Sockets 2. Em vez disso, use getnameinfo.]
A função gethostbyaddr recupera as informações do host correspondentes a um endereço de rede.
Sintaxe
hostent * gethostbyaddr(
const char *addr,
int len,
int type
);
Parâmetros
addr
TBD
len
TBD
type
TBD
Retornar valor
Se nenhum erro ocorrer, gethostbyaddr retornará um ponteiro para a estrutura do hostent . Caso contrário, ele retorna um ponteiro nulo e um código de erro específico pode ser recuperado chamando WSAGetLastError.
Código do erro | Significado |
---|---|
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função. | |
Foi fornecido um argumento inválido. Esse erro será retornado se AF_INET6 foi especificado no parâmetro de tipo e o parâmetro len não foi definido igual ao tamanho de um endereço IPv6. | |
O subsistema de rede falhou. | |
Host de resposta autoritativa não encontrado. | |
O host não autorizado não foi encontrado ou o servidor falhou. | |
Ocorreu um erro não detectável. | |
Nome válido, nenhum registro de dados do tipo solicitado. | |
Uma chamada do Windows Sockets 1.1 de bloqueio está em andamento ou o provedor de serviços ainda está processando uma função de retorno de chamada. | |
O tipo especificado não é compatível com a implementação do Windows Sockets. | |
O parâmetro addr não é uma parte válida do espaço de endereço do usuário ou o parâmetro len é muito pequeno. | |
Uma chamada do Windows Socket 1.1 de bloqueio foi cancelada por meio de WSACancelBlockingCall. |
Comentários
A função gethostbyaddr retorna um ponteiro para a estrutura do host que contém o nome e o endereço correspondentes ao endereço de rede fornecido.
A memória da estrutura de host retornada pela função gethostbyaddr é alocada internamente pela DLL winsock do armazenamento local do thread. Apenas uma única estrutura de hostent é alocada e usada, independentemente de quantas vezes as funções gethostbyaddr ou gethostbyname são chamadas no thread. A estrutura de host retornado deverá ser copiada para um buffer de aplicativo se chamadas adicionais forem feitas para as funções gethostbyaddr ou gethostbyname no mesmo thread. Caso contrário, o valor retornado será substituído por chamadas gethostbyaddr ou gethostbyname subsequentes no mesmo thread. A memória interna alocada para a estrutura de host retornada é liberada pela DLL winsock quando o thread é encerrado.
Um aplicativo não deve tentar liberar a memória usada pela estrutura de host retornada. O aplicativo nunca deve tentar modificar essa estrutura ou liberar nenhum de seus componentes. Além disso, apenas uma cópia dessa estrutura é alocada por thread, portanto, o aplicativo deve copiar todas as informações necessárias antes de emitir qualquer outra chamada de função para gethostbyaddr ou gethostbyname.
Embora gethostbyaddr não seja mais recomendado para uso a partir do Windows Sockets 2 e a função getnameinfo deva ser usada, gethostbyaddr é capaz de retornar um nome NetBIOS; getnameinfo não é. Os desenvolvedores que exigem a resolução de nomes netBIOS podem precisar usar gethostbyaddr até que seus aplicativos sejam completamente independentes de nomes NetBIOS.
Código de exemplo
O exemplo a seguir demonstra o uso da função 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: essa função tem suporte para aplicativos da Windows Phone Store no Windows Phone 8 e posterior.
Windows 8.1 e Windows Server 2012 R2: essa função tem suporte para aplicativos da Windows Store em Windows 8.1, Windows Server 2012 R2 e posteriores.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 8.1, Windows Vista [aplicativos da área de trabalho | Aplicativos UWP] |
Servidor mínimo com suporte | Windows Server 2003 [aplicativos da área de trabalho | Aplicativos UWP] |
Plataforma de Destino | Windows |
Cabeçalho | winsock.h (inclua Winsock2.h, Winsock.h) |
Biblioteca | Ws2_32.lib |
DLL | Ws2_32.dll |