Поделиться через


Макрос gethostbyaddr (wsipv6ok.h)

[Gethostbyaddr больше не рекомендуется использовать в сокетах Windows 2. Вместо этого используйте getnameinfo.]

Функция gethostbyaddr извлекает сведения об узле, соответствующие сетевому адресу.

Синтаксис

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

Параметры

[in] a

Указатель на адрес в сетевом порядке байтов.

[in] b

Длина адреса (в байтах).

[in] c

Тип адреса, например AF_INET тип семейства адресов (используется с TCP, UDP и другими связанными протоколами Интернета). Возможные значения для семейства адресов определяются в файле заголовка Winsock2.h.

В windows SDK, выпущенном для Windows Vista и более поздних версий, организация файлов заголовков изменилась, а возможные значения для семейства адресов определяются в файле заголовка Ws2def.h. Обратите внимание, что файл заголовка Ws2def.h автоматически включается в Winsock2.h и никогда не должен использоваться напрямую.

Обратите внимание, что значения для семейства адресов AF_ и констант семейства протоколов PF_ идентичны (например, AF_INET и PF_INET), поэтому можно использовать любой из констант.

В таблице ниже перечислены возможные значения для семейства адресов, которые поддерживаются.

Значение Значение
AF_INET
2
Семейство адресов IPv4.
AF_NETBIOS
17
Семейство адресов NetBIOS. Это семейство адресов поддерживается только в том случае, если установлен поставщик Сокетов Windows для NetBIOS.
AF_INET6
23
Семейство адресов IPv6.

Возвращаемое значение

None

Remarks

Функция gethostbyaddr возвращает указатель на структуру узла , содержащую имя и адрес, соответствующие заданному сетевому адресу.

Память для структуры размещения , возвращаемой функцией gethostbyaddr , выделяется внутренне библиотекой DLL Winsock из локального хранилища потока. Выделяется и используется только одна структура узла , независимо от того, сколько раз функции gethostbyaddr или gethostbyname вызываются в потоке. Возвращаемая структура узла должна быть скопирована в буфер приложения, если необходимо выполнить дополнительные вызовы функций gethostbyaddr или gethostbyname в том же потоке. В противном случае возвращаемое значение будет перезаписан последующими вызовами gethostbyaddr или gethostbyname в том же потоке. Внутренняя память, выделенная для возвращаемой структуры размещения , освобождается библиотекой DLL Winsock при выходе потока.

Приложение не должно пытаться освободить память, используемую возвращаемой структурой размещения . Приложение никогда не должно пытаться изменить эту структуру или освободить какие-либо из ее компонентов. Кроме того, для каждого потока выделяется только одна копия этой структуры, поэтому приложение должно скопировать все необходимые сведения перед выполнением других вызовов функций gethostbyaddr или gethostbyname.

Хотя gethostbyaddr больше не рекомендуется использовать в сокетах Windows 2 и следует использовать функцию getnameinfo , gethostbyaddr может возвращать netBIOS-имя; Getnameinfo не имеет значение . Разработчикам, которым требуется разрешение имен NetBIOS, может потребоваться использовать gethostbyaddr , пока их приложения не будут полностью независимы от NetBIOS-имен.

Примечание Возможность выполнять обратный просмотр с помощью функции gethostbyaddr удобна, но такие запросы считаются ненадежными и должны использоваться только в качестве указания.
 

Пример кода

В следующем примере показано использование функции 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. Эта функция поддерживается для приложений Магазина Windows Phone Windows Phone 8 и более поздних версий.

Windows 8.1 и Windows Server 2012 R2: эта функция поддерживается для приложений Магазина Windows на Windows 8.1, Windows Server 2012 R2 и более поздних версий.

Требования

   
Минимальная версия клиента Windows 8.1, Windows Vista [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2003 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header wsipv6ok.h (включая Winsock2.h, Winsock.h)
Библиотека Ws2_32.lib
DLL Ws2_32.dll

См. также раздел

GetAddrInfoEx

GetAddrInfoW

WSAsyncGetHostByAddr

Функции Winsock

Справочник по Winsock

addrinfo

addrinfoW

getaddrinfo

Gethostbyname

hostent