Bagikan melalui


fungsi gethostbyaddr (winsock.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

hostent * gethostbyaddr(
  const char *addr,
  int        len,
  int        type
);

Parameter

addr

TBD

len

TBD

type

TBD

Nilai kembali

Jika tidak ada kesalahan yang terjadi, gethostbyaddr mengembalikan penunjuk ke struktur hostent . Jika tidak, ia mengembalikan penunjuk null, dan kode kesalahan tertentu dapat diambil dengan memanggil WSAGetLastError.

Kode kesalahan Makna
WSANOTINITIALISED
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini.
WSAEINVAL
Argumen yang tidak valid disediakan. Kesalahan ini dikembalikan jika AF_INET6 ditentukan dalam parameter jenis dan parameter lensa tidak diatur sama dengan ukuran alamat IPv6.
WSAENETDOWN
Subsistem jaringan gagal.
WSAHOST_NOT_FOUND
Host jawaban otoritatif tidak ditemukan.
WSATRY_AGAIN
Host non-otoritatif tidak ditemukan, atau server gagal.
WSANO_RECOVERY
Terjadi kesalahan yang tidak dapat dipulihkan.
WSANO_DATA
Nama yang valid, tidak ada catatan data dari jenis yang diminta.
WSAEINPROGRESS
Pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik.
WSAEAFNOSUPPORT
Jenis yang ditentukan tidak didukung oleh implementasi Windows Sockets.
WSAEFAULT
Parameter addr bukan bagian yang valid dari ruang alamat pengguna, atau parameter lensa terlalu kecil.
WSAEINTR
Panggilan Windows Socket 1.1 pemblokiran dibatalkan melalui WSACancelBlockingCall.

Keterangan

Fungsi gethostbyaddr mengembalikan penunjuk 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 hostent 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

Persyaratan Nilai
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 winsock.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