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