LV040-域名解析
本文主要是网络编程——域名解析的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
一、域名解析
前边在学习网络编程的一些基本知识的时候,其实已经了解过域名解析的流程了,所以这里就直接记录在C语言中,有关域名解析的相关API函数。
1. gethostbyname()函数
1.1 函数说明
在linux下可以使用man 3 gethostbyname命令查看该函数的帮助手册。
c
/* 需包含的头文件 */
#include <netdb.h>
extern int h_errno; /* 表示出错号 */
/* 函数声明 */
struct hostent *gethostbyname(const char *name);【函数说明】该函数可以通过域名获取IP地址。
【函数参数】
name:char类型指针变量,表示要转换的域名(其实也可以填一个IP地址)。
【返回值】struct hostent类型结构体指针变量,成功返回一个包含了解析后IP地址的hostent结构体变量的地址,失败返回NULL。
【使用格式】none
【注意事项】none
1.2 struct hostent
我们来了解一下上边通过域名获取IP地址的函数的返回值,我们在使用man 3 gethostbyname查看帮助手册的时候,下边有这个结构体说明:
c
struct hostent
{
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
}【成员说明】
h_name:char类型指针变量,表示官方域名(Official domain name)。h_aliases:char类型二级指针真,表示域名的别名,可以通过多个域名访问同一主机。同一IP地址可以绑定多个域名,因此除了当前域名还可以指定其他域名。h_addrtype:int类型,gethostbyname()不仅支持IPv4,还支持IPv6,可以通过此成员获取IP地址的地址族(地址类型)信息,IPv4对应AF_INET,IPv6对应AF_INET6。h_length:int类型,该成员保存IP地址长度。IPv4的长度为4个字节,IPv6的长度为16个字节。h_addr_list:char类型二级指针,这是最重要的成员。通过该成员以整数形式保存域名对应的IP地址。对于用户较多的服务器,可能会分配多个IP地址给同一域名,利用多个服务器进行均衡负载。
**【成员结构图】**感觉上边那样写好像不是很明显,可以看一下下边的图:

1.3 使用实例
c
#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int i = 0;
if (argc != 2)
{
printf("Use example: %s www.baidu.com\n", argv[0]);
return -1;
}
/* 1.解析域名 */
struct hostent *host;
host = gethostbyname(argv[1]);
if(host == NULL)
{
perror("gethostbyname");
return -1;
}
/* 2.打印别名 */
for(i = 0; host->h_aliases[i]; i++)
{
printf("Aliases %d: %s\n", i+1, host->h_aliases[i]);
}
/* 3.打印地址类型 */
printf("Address type: %s\n", (host->h_addrtype == AF_INET) ? "AF_INET" : "AF_INET6");
/* 4.打印解析出来的IP地址 */
for(i = 0; host->h_addr_list[i]; i++)
{
printf("IP addr %d: %s\n", i+1, inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
}
return 0;
}在终端执行以下命令编译程序:
shell
gcc test.c -Wall # 生成可执行文件 a.out
./a.out www.baidu.com # 执行可执行程序然后,终端会有以下信息显示:
shell
Aliases 1: www.baidu.com
Address type: AF_INET
IP addr 1: 39.156.66.18
IP addr 2: 39.156.66.14