Bootstrap

13.5 Linux_网络编程_域名解析

域名解析

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;
}

代码运行结果如下: 

;