域名解析
1、相关函数
//创建一个结构体存放相应信息
struct hostent *gethostbyname(const char *name);
//销毁创建的结构体
void endhostent(void);
//结构体内容
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]
h_aliases:主机的备用名称数组,以NULL结尾
h_addrtype:AF_INET或AF_INET6
h_length:单位字节。AF_INET时为4,AF_INET6时为16
2、实验代码
代码具体实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc,char** argv){
if(argc != 2){
printf("%s <host name>\n",argv[0]);
exit(0);
}
printf("host name = %s\n",argv[1]);
//获取相关信息
int i;
struct hostent* host = gethostbyname(argv[1]);
if(host == NULL){
printf("gethostbyname err\n");
exit(0);
}
//官网域名
printf("官网域名:%s\n",host->h_name);
//别名
for(i=0;host->h_aliases[i]!=NULL;i++){
printf("别名%d:%s\n",i,host->h_aliases[i]);
}
//地址族
switch(host->h_addrtype){
case AF_INET:
printf("地址族:AF_INET\n");
break;
case AF_INET6:
printf("地址族:AF_INET6\n");
break;
}
//地址列表
printf("地址长度:%d\n",host->h_length);
for(i=0;host->h_addr_list[i]!=NULL;i++){
printf("地址%d:%s\n",i,inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
}
return 0;
}
代码运行结果如下: