Compartilhar via


Função gethostbyaddr (winsock2.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 *WSAAPI 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
WSANOTINITIALISED
Uma chamada WSAStartup bem-sucedida deve ocorrer antes de usar essa função.
WSAEINVAL
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.
WSAENETDOWN
O subsistema de rede falhou.
WSAHOST_NOT_FOUND
Host de resposta autoritativa não encontrado.
WSATRY_AGAIN
O host não autorizado não foi encontrado ou o servidor falhou.
WSANO_RECOVERY
Ocorreu um erro não detectável.
WSANO_DATA
Nome válido, nenhum registro de dados do tipo solicitado.
WSAEINPROGRESS
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.
WSAEAFNOSUPPORT
O tipo especificado não é compatível com a implementação do Windows Sockets.
WSAEFAULT
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.
WSAEINTR
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.

Nota A capacidade de executar pesquisas inversas usando a função gethostbyaddr é conveniente, mas essas pesquisas são consideradas inerentemente não confiáveis e devem ser usadas apenas como uma dica.
 

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 winsock2.h (inclua Winsock2.h, Winsock.h)
Biblioteca Ws2_32.lib
DLL Ws2_32.dll

Confira também

GetAddrInfoEx

GetAddrInfoW

WSAAsyncGetHostByAddr

Funções Winsock

Referência de Winsock

Addrinfo

addrinfoW

Getaddrinfo

Gethostbyname

Hostent