域名转化到IP地址的实现

  在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

时间: 2024-10-25 12:57:56

域名转化到IP地址的实现的相关文章

Java 域名能访问IP地址不能访问的问题.

公司GPS信息从GPS服务商那里获取.域名  http://ips2.huoyunren.com/ . 但是最近服务器DNS一直出错,要求接口访问从域名换成IP地址. ping 上面的网址 可以得到IP地址. 奇怪的事情发生了!!! 用域名可以访问,但是通过IP访问就报404错误.类似的情况在 淘宝网(www.taobao.com)上也出现过. 程序拿到域名后,去DNS服务器解析成IP地址,之后根据IP地址访问.这样的话,为什么根据IP地址不能访问网站了呢? 打开Google浏览器,F12进入调

通过主机名(域名)获取IP地址,主机别名等信息

一.所用API函数介绍 struct hostent FAR*gethostbyname( const char FAR* name ); 传入參数:const char FAR* name.主机名或者域名 返回值:一个指向struct hostent的指针 结构体hostent定义例如以下: struct hostent { char FAR *       h_name; char FAR * FAR * h_aliases; short            h_addrtype; sho

Java如何根据主机名(域名)获取IP地址?

在Java编程中,如何根据主机名(域名)获取IP地址? 以下示例显示了如何通过net.InetAddress类的InetAddress.getByName()方法将主机名更改为指定的IP地址. package com.yiibai; import java.net.InetAddress; import java.net.UnknownHostException; public class HostSpecificIPAddress { public static void main(Strin

域名批量转ip地址

缺点:单线程 用途:在内网 如有本地的dns 可获取域名内网真实ip #-*-coding=utf-8-*- # date : 2015年5月6日 # author : sanr   import socket def ip(name): try: result = socket.getaddrinfo(name, None) return result[0][4][0] except: return 0     if __name__=='__main__': f = open('url.tx

DNS管理器——域名映射各个IP地址

如果想查看某个域名的属性,鼠标双击就可以看,如下图所示:

如何配置DNS服务器(局域网——域名指向某个IP地址)

单击“开始”,指向“管理工具”,然后单击“DNS”,打开 DNS 管理器.   如有必要,向管理单元添加适用的服务器,然后连接该服务器.在控制台树中,单击适用的 DNS 服务器.   在“操作”菜单上,单击“配置 DNS 服务器”.打开DNS服务配置向导   然后根据公司规模大小来选择查找区域类型,点击“下一步”主服务器配置界面   如果本机做为DNS服务器,则选择第一项,如果是配置网络上的一台DNS服务器则选择ISP维护区域,选择后点击“下一步”进入区域名称选择窗口.   输入区域名称后点击“

linux下nginx实现虚拟主机(3种方法:基于域名、基于端口、基于ip地址)

在3.17日的时候已经写过一篇关于apahce的基于域名.端口.ip地址3种方式的虚拟主机实现.原理是一样的,现在记录nginx的虚拟主机这三种方式的实现. 系统版本为rhel5.6,nginx版本为1.1.6. 1.基于域名: 基于域名的方式,要先有dns服务器,这里为了方便,可以在/etc/hosts文件里面配置,把它当成dns就行了,可以参考3.17日那篇博客关于dns的配置或者其他博文也有.这里关于nginx的安装也略去. [[email protected] ~]# cat /etc/

网址(url),域名,ip地址,dns,hosts之间的关系

什么是ip? 我们知道,在Internet上有千百万台主机,为了区分这些主机,人们给每台主机都分配了一个专门的地址,称为IP地址.通过IP地址就可以访问到每一台主机. IP地址由4部分数字组成,每部分都不大于256,各部分之间用小数点分开.例如"百度搜索"主机的IP地址就是:"119.75.217.109,"在浏览器上输入这个IP地址,就可以访问到百度的主页. 我们的每个虚拟主机用户,都分配一个永久的IP地址. 什么是域名? 虽然可以通过IP地址来访问每一台主机,但

【Web探索之旅】第三部分第二课:IP地址和域名

内容简介 1.第三部分第二课:IP地址和域名 2.第三部分第三课预告:协议 第三部分第二课:IP地址和域名 上一课我们说了在Web之中,全球各地有无数台机器,有些充当客户机,有些作为服务器. 那么这些机器如何找到和辨认彼此呢?难道不会"只是因为在人群中多看了你一眼,再也没能想起你容颜"吗? 如果我用我的浏览器上网,我怎么知道哪个服务器向我发送此网站呢? 为了解决这个难题,IT科学家们使用了一个叫做IP地址的东西(东西好像有点太难听了,IP它根本就不是个东西好嘛). IP是Interne