linux hostent结构体

hostent结构体
 
hostent是host entry的缩写,该结构记录 主机的信息,包括 主机名、别名、地址类型、地址长度和地址列表。之所以 主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。

目录

1hostent简介

2详细资料

struct hostent
Examples

1hostent简介

hostent的定义如下:
?
1
2
3
4
5
6
7
8
struct  hostent {
char  *h_name;
char  **h_aliases;
int  h_addrtype;
int  h_length;
char  **h_addr_list;
#define h_addr h_addr_list[0]
};

2详细资料

struct hostent

h_name – 地址的正式名称。
h_aliases – 空字节-地址的预备名称的 指针。
h_addrtype –地址类型; 通常是 AF_INET。
h_length – 地址的比特长度。
h_addr_list – 零字节-主机网络地址 指针。网络 字节顺序。
h_addr - h_addr_list中的第一地址。

Examples

gethostbyname()成功时返回一个指向 结构体 hostent 的 指针,或者是个空(NULL)指针。(但是和以前不同,不设置errno,h_errno 设置 错误信息。请看下面的 herror()。但是如何使用呢?这个函数可不像它看上去那么难用。这里是个例子:
一、
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include
#include
#include
#include
#include
#include
#include
int  main( int  argc,  char  *argv[])
{
struct  hostent *h;
if  (argc !=2)
{  fprintf (stderr, "usage:getip address" );
exit (1);
}
if  ((h=gethostbyname(argv[1])) == NULL)
{
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;
}

你可能感兴趣的:(linux,hostent结构体)