Compartilhar via


Macro gethostbyaddr (wsipv6ok.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

void gethostbyaddr(
  [in]  a,
  [in]  b,
  [in]  c
);

Parâmetros

[in] a

Um ponteiro para um endereço na ordem de bytes de rede.

[in] b

O comprimento, em bytes, do endereço.

[in] c

O tipo do endereço, como o AF_INET tipo de família de endereços (usado com TCP, UDP e outros protocolos de Internet associados). Os valores possíveis para a família de endereços são definidos no arquivo de cabeçalho Winsock2.h.

No SDK do Windows lançado para Windows Vista e posterior, a organização dos arquivos de cabeçalho foi alterada e os valores possíveis para a família de endereços são definidos no arquivo de cabeçalho Ws2def.h. Observe que o arquivo de cabeçalho Ws2def.h é incluído automaticamente no Winsock2.h e nunca deve ser usado diretamente.

Observe que os valores para a família de endereços AF_ e PF_ constantes da família de protocolos são idênticos (por exemplo, AF_INET e PF_INET), portanto, qualquer constante pode ser usada.

A tabela a seguir lista os valores possíveis para a família de endereços com suporte.

Valor Significado
AF_INET
2
A família de endereços IPv4 (Protocolo de Internet versão 4).
AF_NETBIOS
17
A família de endereços NetBIOS. Essa família de endereços só terá suporte se um provedor do Windows Sockets para NetBIOS estiver instalado.
AF_INET6
23
A família de endereços IPv6 (Internet Protocol versão 6).

Valor retornado

Nenhum

Comentários

A função gethostbyaddr retorna um ponteiro para a estrutura de host que contém o nome e o endereço correspondentes ao endereço de rede fornecido.

A memória da estrutura do hostent retornada pela função gethostbyaddr é alocada internamente pela DLL winsock do armazenamento local do thread. Somente 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 hostent retornada 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 do 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 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 posterior.

Requisitos

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