Bagikan melalui


makro gethostbyaddr (wsipv6ok.h)

[gethostbyaddr tidak lagi direkomendasikan untuk digunakan pada Windows Sockets 2. Sebagai gantinya, gunakan getnameinfo.]

Fungsi gethostbyaddr mengambil informasi host yang sesuai dengan alamat jaringan.

Sintaks

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

Parameter

[in] a

Penunjuk ke alamat dalam urutan byte jaringan.

[in] b

Panjang, dalam byte, dari alamat.

[in] c

Jenis alamat, seperti jenis keluarga alamat AF_INET (digunakan dengan TCP, UDP, dan protokol Internet terkait lainnya). Nilai yang mungkin untuk keluarga alamat didefinisikan dalam file header Winsock2.h.

Pada Windows SDK yang dirilis untuk Windows Vista dan yang lebih baru, organisasi file header telah berubah dan nilai yang mungkin untuk keluarga alamat ditentukan dalam file header Ws2def.h. Perhatikan bahwa file header Ws2def.h secara otomatis disertakan dalam Winsock2.h, dan tidak boleh digunakan secara langsung.

Perhatikan bahwa nilai untuk keluarga alamat AF_ dan konstanta keluarga protokol PF_ identik (misalnya, AF_INET dan PF_INET), sehingga konstanta mana pun dapat digunakan.

Tabel di bawah ini mencantumkan nilai yang mungkin untuk keluarga alamat yang didukung.

Nilai Makna
AF_INET
2
Keluarga alamat Protokol Internet versi 4 (IPv4).
AF_NETBIOS
17
Keluarga alamat NetBIOS. Keluarga alamat ini hanya didukung jika penyedia Windows Sockets untuk NetBIOS diinstal.
AF_INET6
23
Keluarga alamat Protokol Internet versi 6 (IPv6).

Nilai kembali

Tidak ada

Keterangan

Fungsi gethostbyaddr mengembalikan pointer ke struktur hostent yang berisi nama dan alamat yang sesuai dengan alamat jaringan yang diberikan.

Memori untuk struktur hosten yang dikembalikan oleh fungsi gethostbyaddr dialokasikan secara internal oleh Winsock DLL dari penyimpanan lokal utas. Hanya struktur hosten tunggal yang dialokasikan dan digunakan, tidak peduli berapa kali fungsi gethostbyaddr atau gethostbyname dipanggil pada utas. Struktur hosten yang dikembalikan harus disalin ke buffer aplikasi jika panggilan tambahan harus dilakukan ke fungsi gethostbyaddr atau gethostbyname pada utas yang sama. Jika tidak, nilai yang dikembalikan akan ditimpa oleh panggilan gethostbyaddr atau gethostbyname berikutnya pada utas yang sama. Memori internal yang dialokasikan untuk struktur hosten yang dikembalikan dirilis oleh Winsock DLL ketika utas keluar.

Aplikasi tidak boleh mencoba melepaskan memori yang digunakan oleh struktur hosten yang dikembalikan. Aplikasi tidak boleh mencoba memodifikasi struktur ini atau membebaskan salah satu komponennya. Selain itu, hanya satu salinan struktur ini yang dialokasikan per utas, sehingga aplikasi harus menyalin informasi apa pun yang dibutuhkan sebelum mengeluarkan panggilan fungsi lain ke gethostbyaddr atau gethostbyname.

Meskipun gethostbyaddr tidak lagi direkomendasikan untuk digunakan pada Windows Sockets 2 dan fungsi getnameinfo harus digunakan, gethostbyaddr mampu mengembalikan nama NetBIOS; getnameinfo tidak. Pengembang yang membutuhkan resolusi nama NetBIOS mungkin perlu menggunakan gethostbyaddr sampai aplikasi mereka benar-benar independen dari nama NetBIOS.

Catatan Kemampuan untuk melakukan pencarian terbalik menggunakan fungsi gethostbyaddr nyaman, tetapi pencarian tersebut dianggap secara inheren tidak dapat diandalkan, dan harus digunakan hanya sebagai petunjuk.
 

Contoh Kode

Contoh berikut menunjukkan penggunaan fungsi 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: Fungsi ini didukung untuk aplikasi Windows Phone Store di Windows Phone 8 dan yang lebih baru.

Windows 8.1 dan Windows Server 2012 R2: Fungsi ini didukung untuk aplikasi Windows Store di Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.

Persyaratan

   
Klien minimum yang didukung Windows 8.1, Windows Vista [aplikasi desktop | Aplikasi UWP]
Server minimum yang didukung Windows Server 2003 [aplikasi desktop | Aplikasi UWP]
Target Platform Windows
Header wsipv6ok.h (termasuk Winsock2.h, Winsock.h)
Pustaka Ws2_32.lib
DLL Ws2_32.dll

Lihat juga

GetAddrInfoEx

GetAddrInfoW

WSAAsyncGetHostByAddr

Fungsi Winsock

Referensi Winsock

addrinfo

addrinfoW

getaddrinfo

gethostbyname

hostent