Struktur HOSTENT (winsock2.h)
Struktur hosten digunakan oleh fungsi untuk menyimpan informasi tentang host tertentu, seperti nama host, alamat IPv4, dan sebagainya. Aplikasi tidak boleh mencoba memodifikasi struktur ini atau membebaskan salah satu komponennya. Selain itu, hanya satu salinan struktur hosten yang dialokasikan per utas, dan oleh karena itu aplikasi harus menyalin informasi apa pun yang dibutuhkan sebelum mengeluarkan panggilan WINDOWS Sockets API lainnya.
Sintaks
typedef struct hostent {
char *h_name;
char **h_aliases;
short h_addrtype;
short h_length;
char **h_addr_list;
} HOSTENT, *PHOSTENT, *LPHOSTENT;
Anggota
h_name
Nama resmi host (PC). Jika menggunakan DNS atau sistem resolusi serupa, ini adalah Nama Domain yang Sepenuhnya Memenuhi Syarat (FQDN) yang menyebabkan server mengembalikan balasan. Jika menggunakan file host lokal, ini adalah entri pertama setelah alamat IPv4.
h_aliases
Array nama alternatif yang dihentikan NULL.
h_addrtype
Jenis alamat yang dikembalikan.
h_length
Panjangnya, dalam byte, dari setiap alamat.
h_addr_list
Daftar alamat yang dihentikan NULL untuk host. Alamat dikembalikan dalam urutan byte jaringan.
Makro h_addr didefinisikan untuk h_addr_list[0]
kompatibilitas dengan perangkat lunak yang lebih lama.
Keterangan
Fungsi gethostbyaddr dan gethostbyname mengembalikan penunjuk ke struktur hostent —struktur yang dialokasikan oleh Windows Sockets. Struktur hostent berisi hasil pencarian yang berhasil untuk host yang ditentukan dalam parameter nama .
Memori untuk struktur hosten yang dikembalikan oleh fungsi gethostbyaddr dan gethostbyname 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.
Contoh
Contoh berikut menunjukkan penggunaan struktur hostent dengan fungsi gethostbyname .
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char **argv)
{
//-----------------------------------------
// Declare and initialize variables
WSADATA wsaData;
int iResult;
DWORD dwError;
int i = 0;
struct hostent *remoteHost;
char *host_name;
struct in_addr addr;
char **pAlias;
// Validate the parameters
if (argc != 2) {
printf("usage: %s ipv4address\n", argv[0]);
printf(" or\n");
printf(" %s hostname\n", argv[0]);
printf(" to return the host\n");
printf(" %s 127.0.0.1\n", argv[0]);
printf(" to return the IP addresses for a host\n");
printf(" %s www.contoso.com\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_name = argv[1];
// If the user input is an alpha name for the host, use gethostbyname()
// If not, get host by addr (assume IPv4)
if (isalpha(host_name[0])) { /* host address is a name */
printf("Calling gethostbyname with %s\n", host_name);
remoteHost = gethostbyname(host_name);
} else {
printf("Calling gethostbyaddr with %s\n", host_name);
addr.s_addr = inet_addr(host_name);
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;
}
Persyaratan
Klien minimum yang didukung | Windows 2000 Professional [hanya aplikasi desktop] |
Server minimum yang didukung | Windows 2000 Server [hanya aplikasi desktop] |
Header | winsock2.h (termasuk Winsock2.h) |