前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >域名转化到IP地址的实现

域名转化到IP地址的实现

作者头像
小爷毛毛_卓寿杰
发布2019-02-13 12:23:59
6.1K0
发布2019-02-13 12:23:59
举报
文章被收录于专栏:Soul Joy HubSoul Joy HubSoul Joy Hub

在linux中,有一些函数可以实现主机名和地址的转化,最常见的有gethostbyname()、gethostbyaddr()等,它们都可以实现IPv4和IPv6的地址和主机名之间的转化。其中gethostbyname()是将主机名转化为IP地址,gethostbyaddr()则是逆操作,是将IP地址转化为主机名。

    函数原型:

1    #include <netdb.h>
2 
3         struct hostent* gethostbyname(const char* hostname);
4 
5         struct hostent* gethostbyaddr(const char* addr, size_t len, int family);

    结构体:

1 struct hostent
 2 
 3         {
 4 
 5             char *h_name;       /*正式主机名*/
 6 
 7             char **h_aliases;   /*主机别名*/
 8 
 9             int h_addrtype;     /*主机IP地址类型 IPv4为AF_INET*/
10 
11             int h_length;       /*主机IP地址字节长度,对于IPv4是4字节,即32位*/
12 
13             char **h_addr_list; /*主机的IP地址列表*/
14 
15         }
16 
17         #define  h_addr  h_addr_list[0] /*保存的是ip地址*/

      函数gethostbyname():用于将域名(www.baidu.com)或主机名转换为IP地址。参数hostname指向存放域名或主机名的字符串。

      函数gethostbyaddr():用于将IP地址转换为域名或主机名。参数addr是一个IP地址,此时这个ip地址不是普通的字符串,而是要通过函数inet_aton()转换。len为IP地址的长度,AF_INET为4。family可用AF_INET:Ipv4或AF_INET6:Ipv6。

  Example:将百度的www.baidu.com 转换为ip地址

1 #include <netdb.h>
 2 
 3 #include <sys/socket.h>
 4 
 5 #include <stdio.h>
 6 
 7 int main(int argc, char **argv)
 8 
 9 {
10 
11 char *ptr, **pptr;
12 
13     struct hostent *hptr;
14 
15     char str[32] = {'\0'};
16 
17 /* 取得命令后第一个参数,即要解析的域名或主机名 */
18 
19 ptr = argv[1];  //如www.baidu.com
20 
21 /* 调用gethostbyname()。结果存在hptr结构中 */
22 
23     if((hptr = gethostbyname(ptr)) == NULL)
24 
25     {
26 
27         printf(" gethostbyname error for host:%s\n", ptr);
28 
29         return 0;
30 
31     }
32 
33 /* 将主机的规范名打出来 */
34 
35     printf("official hostname:%s\n",hptr->h_name);
36 
37 /* 主机可能有多个别名,将所有别名分别打出来 */
38 
39 for(pptr = hptr->h_aliases; *pptr != NULL; pptr++)
40 
41 printf(" alias:%s\n",*pptr);
42 
43               /* 根据地址类型,将地址打出来 */
44 
45 switch(hptr->h_addrtype)
46 
47     {
48 
49 case AF_INET,AF_INET6:
50 
51 pptr=hptr->h_addr_list;
52 
53                             /* 将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数 */
54 
55             for(; *pptr!=NULL; pptr++)
56 
57                 printf(" address:%s\n", inet_ntop(hptr->h_addrtype, *pptr, str, sizeof(str)));
58 
59             printf(" first address: %s\n", inet_ntop(hptr->h_addrtype, hptr->h_addr, str, sizeof(str)));
60 
61         break;
62 
63         default:
64 
65             printf("unknown address type\n");
66 
67         break;
68 
69     }
70 
71     return 0;
72 
73 }

编译运行

#gcc test.c

#./a.out www.baidu.com

official hostname:www.a.shifen.com

alias:www.baidu.com

address: 220.181.111.148

……

first address: 220.181.111.148

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年06月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NAT 网关
NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档