gethostbyname()函数:
通过名字地址获取相关信息的函数,返回的是一个struct hostent *,
hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。
就是结构指针,结构体的成员是这样定义的:
1 struct hostent 2 { 3 char* h_name; 4 char* h_aliases; 5 short h_addrtype; 6 short h_length; 7 char **h_addr_list; 8 }; #define h_addr h_addr_list[0]
h_name – 地址的正式名称。
h_aliases – 空字节-地址的预备名称的指针。
h_addrtype –地址类型; 通常是AF_INET(IPv4)。
h_length – 地址的比特长度。
h_addr_list – 零字节-主机网络地址指针。按照网络字节顺序存储。
h_addr - h_addr_list中的首地址。
示例,通过www.sina.com获取主机别名等信息:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 #include<sys/types.h> 5 #include<sys/socket.h> 6 #include<netinet/in.h> 7 #include<errno.h> 8 #include<netdb.h> 9 #include<string.h> 10 11 int main(void) 12 { 13 char *ptr="www.baidu.com"; 14 struct hostent *hptr; 15 if((hptr=gethostbyname(ptr))==NULL) 16 { 17 printf("Error to gethostbyname\n"); 18 exit(1); 19 } 20 printf("hostname is %s\n",hptr->h_name); 21 22 char **alianame=hptr->h_aliases; 23 while(*alianame) 24 { 25 printf("alias name is %s\n",*alianame); 26 ++alianame; 27 } 28 return 0; 29 }
返回的是主机名和别名
如果需要或取IP,那么需要像这样:
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 #include<sys/types.h> 5 #include<sys/socket.h> 6 #include<netinet/in.h> 7 #include<arpa/inet.h> 8 #include<errno.h> 9 #include<netdb.h> 10 #include<string.h> 11 12 int main(void) 13 { 14 char *ptr="www.baidu.com"; 15 struct hostent *hptr; 16 if((hptr=gethostbyname(ptr))==NULL) 17 { 18 printf("Error to gethostbyname\n"); 19 exit(1); 20 } 21 printf("hostname is %s\n",hptr->h_name); 22 23 char **alianame=hptr->h_aliases; 24 while(*alianame) 25 { 26 printf("alias name is %s\n",*alianame); 27 ++alianame; 28 } 29 const char *ip; 30 31 int addrtype=hptr->h_addrtype; 32 char str[INET6_ADDRSTRLEN]; 33 ip=inet_ntop(addrtype,hptr->h_addr,str,sizeof(str)); 34 35 printf("ip address is : %s\n",ip); 36 return 0; 37 }
时间: 2024-10-12 19:06:12