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 |
---|---|
Panggilan WSAStartup yang berhasil harus terjadi sebelum menggunakan fungsi ini. | |
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. | |
Subsistem jaringan gagal. | |
Host jawaban otoritatif tidak ditemukan. | |
Host non-otoritatif tidak ditemukan, atau server gagal. | |
Terjadi kesalahan yang tidak dapat dipulihkan. | |
Nama yang valid, tidak ada catatan data dari jenis yang diminta. | |
Pemblokiran panggilan Windows Sockets 1.1 sedang berlangsung, atau penyedia layanan masih memproses fungsi panggilan balik. | |
Jenis yang ditentukan tidak didukung oleh implementasi Windows Sockets. | |
Parameter addr bukan bagian yang valid dari ruang alamat pengguna, atau parameter lensa terlalu kecil. | |
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.
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 |